masm32的kernel32.lib有问题?

时间:2021-03-06 01:14:05
.386
.model flat,stdcall
includelib libc.lib
includelib kernel32.lib
printf proto c :dword
.data
msg byte 'Hello',0
.code
main proc c
       invoke printf,offset msg
       ret
main endp
       end

上面的程序调用c 库的printf 显示 Hello

使用masm32自带的kernel32.lib 编译不能通过,提示
__imp_GetEnvironmentStrings@0 未解决,但若使用vc 自带的kernel32.lib 没任何问题,
用dumpbin dump 两者的kernel32.lib,发现masm32自带的kernel32.lib 确实没有符号:
__imp_GetEnvironmentStrings@0(只有__imp__GetEnvironmentStringsA@0和__imp__GetEnvironmentStringsW@0),而vc6.0的有__imp_GetEnvironmentStrings@0。

是否masm32自带的kernel32.lib 有问题?(它比vc6.0带的大很多)

28 个解决方案

#1


c函数中的printf是cdecl调用方式,就是人们说的C调用方式

而win32函数才是stdcall调用方式,另外

__imp__GetEnvironmentStringsA@0   //这是单字符版的函数
__imp__GetEnvironmentStringsW@0   //这是UNICODE版的函数

#2


不是你说的这么回事,不是printf未解决,而是Api函数GetEnvironmentStrings未解决,我说过了,用vc的kernel32.lib正常,而且用masm32 v7 的kernel32.lib也正常,不正常的是masm32 v8.0 和v9.0 的kernel32.lib 没有输出函数GetEnvironmentStrings。

#3


masm32 v7.0 的kernel32.lib 600多k
masm32 v8.0/v9.0 的kernel 400多k,
老版本的kernel32.lib api 函数更多?

#4


1 首先 kernel32.dll 中没有 GetEnvironmentStrings 这个 api

2 GetEnvironmentStrings 在 kernel32.inc 中被 equ 定义:

  GetEnvironmentStrings equ <GetEnvironmentStringsA>

3 建议楼主:

  a. 可能原来的 lib 中静态实现了 GetEnvironmentStrings

  b. 添加 kernel32.inc 引用试试

#5


加入kernel32.inc 也有用,因为不是我的代码调用GetEnvironmentStrings,而是a_env.obj(在libc.lib中) 调用了这个函数,按你的说法此函数不是真正的Api而是被映射为
GetEnvironmentStringsA 或GetEnvironmentStringsW,那为什么a_env.obj在编译时,没有被映射为GetEnvironmentStringsA 或GetEnvironmentStringsW,而是原始的
GetEnvironmentStrings。这点解释不通。而且关键的一点是:
600多k 的kernel32.lib(v7.0带),确实有这个符号(连 xxxA xxxW  共三个符号都用)。

#6


上面打错了:
加入kernel32.inc 也没有用。

#7


看了一下vc6.0的winbase.h,其中有:

WINBASEAPI
LPSTR
WINAPI
GetEnvironmentStrings(
    VOID
    );

WINBASEAPI
LPWSTR
WINAPI
GetEnvironmentStringsW(
    VOID
    );

#ifdef UNICODE
#define GetEnvironmentStrings  GetEnvironmentStringsW
#else
#define GetEnvironmentStringsA  GetEnvironmentStrings
#endif // !UNICODE

从上可看出,与一般的函数相反(如MessageBox 被映射为MessageBoxA/W,
),这里是GetEnvironmentStringsA  映射为GetEnvironmentString,与一般函数是刚好相反的,
很可能是masm32自作聪明,把GetEnvironmentStrings去除了,如果要去除也是应去除
GetEnvironmentStringsA  ,它反真正的函数GetEnvironmentString从输入库中去除了,
然后inc中来一句GetEnvironmentStringsA equ <GetEnvironmentStrings>
这样才与vc6.0 的含义的一样的,这里刚好搞反了。以上是我的新看法,大家有何高见?

下面是反汇编代码

5:    char* p=GetEnvironmentStrings();
00401028 8B F4                mov         esi,esp
0040102A FF 15 4C A1 42 00    call        dword ptr [__imp__GetEnvironmentStrings@0 (0042a14c)]
00401030 3B F4                cmp         esi,esp
00401032 E8 F9 00 00 00       call        __chkesp (00401130)
00401037 89 45 FC             mov         dword ptr [ebp-4],eax
6:    char* p2=GetEnvironmentStringsA();
0040103A 8B F4                mov         esi,esp
0040103C FF 15 4C A1 42 00    call        dword ptr [__imp__GetEnvironmentStrings@0 (0042a14c)]
00401042 3B F4                cmp         esi,esp
00401044 E8 E7 00 00 00       call        __chkesp (00401130)
00401049 89 45 F8             mov         dword ptr [ebp-8],eax
7:

#8


楼主一天都在搞这个~执着~mybe

#9


楼主一天都在搞这个~执着~maybe

#10


是啊,不搞清楚很不爽。

即kernel32.dll 中是有GetEnvironmentStrings 这个 api的,
而真正没有的是GetEnvironmentStringsA 这个函数
本来inc 应该GetEnvironmentStringsA equ <GetEnvironmentStrings> (根据vc6.0 的winbase.h中GetEnvironStringsA的定义可作如此推断)

而masm32的inc 刚好搞反了变为GetEnvironmentStrings equ <GetEnvironmentStringsA>

上面只是我的推断,mydo可否花点时间深入研究一下?

#11


有 qq 或 msn 么?聊聊

#12


没qq,lielvb(),要是感兴趣,研究一下?

#13


另有一处不明,masm v7.0 安装后在masm32\lib 的lib 是1997年的时间,
而masm32 v8.0 安装后masm32\lib中的lib是安装时的当前时间,
按道理象kernel32.lib 这样的输入库是定好的,安装时解压缩到文件夹即可(就象masm32 v7 一样),include文件夹中的所有inc文件,都是安装时根据lib用l2inca.exe 动态生成的,所以
inc文件的时间是安装时间,不会masm32 v8.0 的lib 也是根据环境动态生成?

#14


到masm32的国外论坛去问了一下,masm32的作者hutch亲自作答,很是感动,尽管没有作出实质的回答,老外真是太热情了,下面是hutch的回答:
To use LIBC.LIB, you need to have a lot more of it prototyped but for the API GetEnvironmentStrings() try including the kernel32.inc file from masm32.

If you have it, use masm32 version 9.0, it is much later and has had a lot more work done on it.

Note with the c runtime function "printf" that it is not the library that does the C escapes but the compiler so you will not get them to work without doing the escape expansions yourself.


The libraries from version 7 were from the win98 platformsdk where the later ones are built using ML and LINK. If you have your full VC installation try using the lkernel32.lib from there, it should work. Other than that, download a current platformsdk and use the libraries from there, they should also do the job and are probably later than a VC installation.

感兴趣者,可到
http://www.masm32.com/board/index.php?topic=6067.0
看一下,hutch会不会有新的回答。

#15


执着的人啊~

#16


hutch(masm32的作者)最终给出了令人满意的答复:


There is a very simple solution, change the kernel32.inc file like this.


Code:
GetEnvironmentStrings  PROTO 
GetEnvironmentStringsA PROTO 
;;; GetEnvironmentStrings equ <GetEnvironmentStringsA>
GetEnvironmentStringsW PROTO 

Build the library with inc2l.exe then remove the "GetEnvironmentStrings  PROTO" and uncomment the equate. 
 
 Report to moderator    Logged  
 
这样看来确实masm32 v8/v9 的kernel32.lib 是有点问题,按他的作法,
修改kernel32.inc 将GetEnvironmentStrings equ <GetEnvironmentStringsA>这一句去除
加一句:GetEnvironmentStrings  PROTO 
再用inc2l.exe 从kernel32.inc生成kernel32.lib,用这个新生成的kernel32.lib上面的程序就完全正常了。

几点看法:
1)如果要在汇编中调用c 库函数,最好还是用vc 中自带的kernel32.lib user32.lib 等
2)masm32 的windows.inc kernel32.lib始终不是ms官方的文档,可能会上些小问题。

#17


对 2 表示同意

#18


另外,第一次在英文论坛上发贴,感觉英文太差,病句很多,还好,老外还是看懂了。

#19


过了英语8级,可是一句话说不出来

#20


8级,太厉害了。

#21


不是说我~ ^.^

#22


还有没有其他高见?

此贴已加至100分,我还有另一个问题要问:

我的树形控件同样也不能展开(原贴在vc区及投诉区)

我的树形控件同样也不能展开,显示加载中,我在论坛上问了很长时间,也没解决,其他人也遇到过同样的问题,显示网页有问题,automation不能创建对象,是不是csdn网页有问题?如何解决。已将ie安全设为最低,也没用,重新安装msxms也没有,重新修复安装winxp(sp2)仍是没用?(用firefox正常,但有些网页文字有重迭)

此贴已放入投诉区,本希望csdn内部的人能解答一下,到现在动静都没有,谁遇到过类似问题?
帮顶也行,至少要让csdn里面的人看到,还有一大堆人等他们出来解答一下。

#23


问题是:
点击csdn论坛“我的技术社区”,其下的条目不会显示出来,显示“加载中。。。"

#24


我在:

ie 6.0 /firefox 1.x/2.0 /maxthon 1.x 

都没有遇到楼主所说的情况

#25


是啊,偏偏给我碰上了,我在vc中的那个贴子中,其他人也遇到过,并还在等待解决。
你用firefox 2.0 上aogosoft正不正常? 我的左面全是重迭的文字,ie6.0 sp2正常。

#26


qtext() 
即kernel32.dll 中是有GetEnvironmentStrings 这个 api的,
而真正没有的是GetEnvironmentStringsA 这个函数
----------------------------------------------
错了,kernel32.dll 中有GetEnvironmentStrings 这个API,也有这个GetEnvironmentStringsA,虽然这2个API功能是一模一样的,因为都指向相同的虚拟地址,但还是要2者都定义,即
GetEnvironmentStrings  PROTO 
GetEnvironmentStringsA PROTO 

类比user32.dll里就只有MessageBoxA这个API,实际上没有MessageBox这个API,所以只定义MessageBoxA这个API,而MessageBox用equ
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
MessageBox equ <MessageBoxA>

自己的见解,不过API有没有这个是可以确定的,我直接导出了dll文件的导出函数看过了

#27


我当时说kernel32.dll没有GetEnvironmentStringsA 
是根据winbase.h中:

#ifdef UNICODE
#define GetEnvironmentStrings  GetEnvironmentStringsW
#else
#define GetEnvironmentStringsA  GetEnvironmentStrings
#endif // !UNICODE

推断出来的,但后来我用

我用vc的depends看了kernel32.dll,确实有三个输出函数
GetEnvironmentStrings
GetEnvironmentStringsA
GetEnvironmentStringsW

但我主要是说kernel32.lib(masm32 v8)为什么没有GetEnvironmentStrings
这显然是有错的(而实际情况kernel32.dll不管是win98/win2k/2inxp都有这三个函数),这才是导至我开头的程序编译出错的根本原因。

#28


另:树形控件显示不正常的问题已解决(在投诉区人有回答regsvr32 msxml3.dll,确实可以),总算不用重装系统了,明天结贴。

#1


c函数中的printf是cdecl调用方式,就是人们说的C调用方式

而win32函数才是stdcall调用方式,另外

__imp__GetEnvironmentStringsA@0   //这是单字符版的函数
__imp__GetEnvironmentStringsW@0   //这是UNICODE版的函数

#2


不是你说的这么回事,不是printf未解决,而是Api函数GetEnvironmentStrings未解决,我说过了,用vc的kernel32.lib正常,而且用masm32 v7 的kernel32.lib也正常,不正常的是masm32 v8.0 和v9.0 的kernel32.lib 没有输出函数GetEnvironmentStrings。

#3


masm32 v7.0 的kernel32.lib 600多k
masm32 v8.0/v9.0 的kernel 400多k,
老版本的kernel32.lib api 函数更多?

#4


1 首先 kernel32.dll 中没有 GetEnvironmentStrings 这个 api

2 GetEnvironmentStrings 在 kernel32.inc 中被 equ 定义:

  GetEnvironmentStrings equ <GetEnvironmentStringsA>

3 建议楼主:

  a. 可能原来的 lib 中静态实现了 GetEnvironmentStrings

  b. 添加 kernel32.inc 引用试试

#5


加入kernel32.inc 也有用,因为不是我的代码调用GetEnvironmentStrings,而是a_env.obj(在libc.lib中) 调用了这个函数,按你的说法此函数不是真正的Api而是被映射为
GetEnvironmentStringsA 或GetEnvironmentStringsW,那为什么a_env.obj在编译时,没有被映射为GetEnvironmentStringsA 或GetEnvironmentStringsW,而是原始的
GetEnvironmentStrings。这点解释不通。而且关键的一点是:
600多k 的kernel32.lib(v7.0带),确实有这个符号(连 xxxA xxxW  共三个符号都用)。

#6


上面打错了:
加入kernel32.inc 也没有用。

#7


看了一下vc6.0的winbase.h,其中有:

WINBASEAPI
LPSTR
WINAPI
GetEnvironmentStrings(
    VOID
    );

WINBASEAPI
LPWSTR
WINAPI
GetEnvironmentStringsW(
    VOID
    );

#ifdef UNICODE
#define GetEnvironmentStrings  GetEnvironmentStringsW
#else
#define GetEnvironmentStringsA  GetEnvironmentStrings
#endif // !UNICODE

从上可看出,与一般的函数相反(如MessageBox 被映射为MessageBoxA/W,
),这里是GetEnvironmentStringsA  映射为GetEnvironmentString,与一般函数是刚好相反的,
很可能是masm32自作聪明,把GetEnvironmentStrings去除了,如果要去除也是应去除
GetEnvironmentStringsA  ,它反真正的函数GetEnvironmentString从输入库中去除了,
然后inc中来一句GetEnvironmentStringsA equ <GetEnvironmentStrings>
这样才与vc6.0 的含义的一样的,这里刚好搞反了。以上是我的新看法,大家有何高见?

下面是反汇编代码

5:    char* p=GetEnvironmentStrings();
00401028 8B F4                mov         esi,esp
0040102A FF 15 4C A1 42 00    call        dword ptr [__imp__GetEnvironmentStrings@0 (0042a14c)]
00401030 3B F4                cmp         esi,esp
00401032 E8 F9 00 00 00       call        __chkesp (00401130)
00401037 89 45 FC             mov         dword ptr [ebp-4],eax
6:    char* p2=GetEnvironmentStringsA();
0040103A 8B F4                mov         esi,esp
0040103C FF 15 4C A1 42 00    call        dword ptr [__imp__GetEnvironmentStrings@0 (0042a14c)]
00401042 3B F4                cmp         esi,esp
00401044 E8 E7 00 00 00       call        __chkesp (00401130)
00401049 89 45 F8             mov         dword ptr [ebp-8],eax
7:

#8


楼主一天都在搞这个~执着~mybe

#9


楼主一天都在搞这个~执着~maybe

#10


是啊,不搞清楚很不爽。

即kernel32.dll 中是有GetEnvironmentStrings 这个 api的,
而真正没有的是GetEnvironmentStringsA 这个函数
本来inc 应该GetEnvironmentStringsA equ <GetEnvironmentStrings> (根据vc6.0 的winbase.h中GetEnvironStringsA的定义可作如此推断)

而masm32的inc 刚好搞反了变为GetEnvironmentStrings equ <GetEnvironmentStringsA>

上面只是我的推断,mydo可否花点时间深入研究一下?

#11


有 qq 或 msn 么?聊聊

#12


没qq,lielvb(),要是感兴趣,研究一下?

#13


另有一处不明,masm v7.0 安装后在masm32\lib 的lib 是1997年的时间,
而masm32 v8.0 安装后masm32\lib中的lib是安装时的当前时间,
按道理象kernel32.lib 这样的输入库是定好的,安装时解压缩到文件夹即可(就象masm32 v7 一样),include文件夹中的所有inc文件,都是安装时根据lib用l2inca.exe 动态生成的,所以
inc文件的时间是安装时间,不会masm32 v8.0 的lib 也是根据环境动态生成?

#14


到masm32的国外论坛去问了一下,masm32的作者hutch亲自作答,很是感动,尽管没有作出实质的回答,老外真是太热情了,下面是hutch的回答:
To use LIBC.LIB, you need to have a lot more of it prototyped but for the API GetEnvironmentStrings() try including the kernel32.inc file from masm32.

If you have it, use masm32 version 9.0, it is much later and has had a lot more work done on it.

Note with the c runtime function "printf" that it is not the library that does the C escapes but the compiler so you will not get them to work without doing the escape expansions yourself.


The libraries from version 7 were from the win98 platformsdk where the later ones are built using ML and LINK. If you have your full VC installation try using the lkernel32.lib from there, it should work. Other than that, download a current platformsdk and use the libraries from there, they should also do the job and are probably later than a VC installation.

感兴趣者,可到
http://www.masm32.com/board/index.php?topic=6067.0
看一下,hutch会不会有新的回答。

#15


执着的人啊~

#16


hutch(masm32的作者)最终给出了令人满意的答复:


There is a very simple solution, change the kernel32.inc file like this.


Code:
GetEnvironmentStrings  PROTO 
GetEnvironmentStringsA PROTO 
;;; GetEnvironmentStrings equ <GetEnvironmentStringsA>
GetEnvironmentStringsW PROTO 

Build the library with inc2l.exe then remove the "GetEnvironmentStrings  PROTO" and uncomment the equate. 
 
 Report to moderator    Logged  
 
这样看来确实masm32 v8/v9 的kernel32.lib 是有点问题,按他的作法,
修改kernel32.inc 将GetEnvironmentStrings equ <GetEnvironmentStringsA>这一句去除
加一句:GetEnvironmentStrings  PROTO 
再用inc2l.exe 从kernel32.inc生成kernel32.lib,用这个新生成的kernel32.lib上面的程序就完全正常了。

几点看法:
1)如果要在汇编中调用c 库函数,最好还是用vc 中自带的kernel32.lib user32.lib 等
2)masm32 的windows.inc kernel32.lib始终不是ms官方的文档,可能会上些小问题。

#17


对 2 表示同意

#18


另外,第一次在英文论坛上发贴,感觉英文太差,病句很多,还好,老外还是看懂了。

#19


过了英语8级,可是一句话说不出来

#20


8级,太厉害了。

#21


不是说我~ ^.^

#22


还有没有其他高见?

此贴已加至100分,我还有另一个问题要问:

我的树形控件同样也不能展开(原贴在vc区及投诉区)

我的树形控件同样也不能展开,显示加载中,我在论坛上问了很长时间,也没解决,其他人也遇到过同样的问题,显示网页有问题,automation不能创建对象,是不是csdn网页有问题?如何解决。已将ie安全设为最低,也没用,重新安装msxms也没有,重新修复安装winxp(sp2)仍是没用?(用firefox正常,但有些网页文字有重迭)

此贴已放入投诉区,本希望csdn内部的人能解答一下,到现在动静都没有,谁遇到过类似问题?
帮顶也行,至少要让csdn里面的人看到,还有一大堆人等他们出来解答一下。

#23


问题是:
点击csdn论坛“我的技术社区”,其下的条目不会显示出来,显示“加载中。。。"

#24


我在:

ie 6.0 /firefox 1.x/2.0 /maxthon 1.x 

都没有遇到楼主所说的情况

#25


是啊,偏偏给我碰上了,我在vc中的那个贴子中,其他人也遇到过,并还在等待解决。
你用firefox 2.0 上aogosoft正不正常? 我的左面全是重迭的文字,ie6.0 sp2正常。

#26


qtext() 
即kernel32.dll 中是有GetEnvironmentStrings 这个 api的,
而真正没有的是GetEnvironmentStringsA 这个函数
----------------------------------------------
错了,kernel32.dll 中有GetEnvironmentStrings 这个API,也有这个GetEnvironmentStringsA,虽然这2个API功能是一模一样的,因为都指向相同的虚拟地址,但还是要2者都定义,即
GetEnvironmentStrings  PROTO 
GetEnvironmentStringsA PROTO 

类比user32.dll里就只有MessageBoxA这个API,实际上没有MessageBox这个API,所以只定义MessageBoxA这个API,而MessageBox用equ
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
MessageBox equ <MessageBoxA>

自己的见解,不过API有没有这个是可以确定的,我直接导出了dll文件的导出函数看过了

#27


我当时说kernel32.dll没有GetEnvironmentStringsA 
是根据winbase.h中:

#ifdef UNICODE
#define GetEnvironmentStrings  GetEnvironmentStringsW
#else
#define GetEnvironmentStringsA  GetEnvironmentStrings
#endif // !UNICODE

推断出来的,但后来我用

我用vc的depends看了kernel32.dll,确实有三个输出函数
GetEnvironmentStrings
GetEnvironmentStringsA
GetEnvironmentStringsW

但我主要是说kernel32.lib(masm32 v8)为什么没有GetEnvironmentStrings
这显然是有错的(而实际情况kernel32.dll不管是win98/win2k/2inxp都有这三个函数),这才是导至我开头的程序编译出错的根本原因。

#28


另:树形控件显示不正常的问题已解决(在投诉区人有回答regsvr32 msxml3.dll,确实可以),总算不用重装系统了,明天结贴。