MASM32v11编程调用Process32First失败: 程序发出命令,但命令长度不正确

简介: MASM32v11编程调用Process32First失败: 程序发出命令,但命令长度不正确

一位网友发来邮件反映说用MASM32写GUI版的netstat-NetViewG.exe不能在Windows 10上运行。

试了一下,NetViewG.exe在Windows 10上运行确实会给出一个出错提示,不能在窗口里显示协议统计信息和当前 TCP/IP 网络连接信息。

原因是NetViewG.exe是2008年写的,所使用的API函数 AllocateAndGetTcpExTableFromStack和AllocateAndGetUdpExTableFromStack, 从Windows 7开始iphlpapi.dll已经不再支持,也就是说NetViewG.exe只能在Windows XP上正常运行。

利用周末空闲更新一下吧。

找了一下,只找到NetViewC.exe的的源代码。

重新汇编连接NetViewC,遇到提示:

R:\masm32\works\netView>\MASM32\BIN\Buildc.bat 3
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: 3.asm

***********
ASCII build
***********

3.asm(256) : error A2006: undefined symbol : Process32First
3.asm(269) : error A2006: undefined symbol : Process32Next
_
Assembly Error
请按任意键继续. . .

这两个函数是在MASM32中是在kernel32.inc定义的,怎么会没定义?

打开kernel32.inc查找:

Process32FirstW PROTO STDCALL :DWORD,:DWORD
IFDEF __UNICODE__
  Process32First equ <Process32FirstW>
ENDIF


Process32NextW PROTO STDCALL :DWORD,:DWORD
IFDEF __UNICODE__
  Process32Next equ <Process32NextW>
ENDIF

怎么只有Unicode版本的,没有ANSI版本的?

那就用Unicode版本的看看,汇编连接顺利完成,但程序运行到Process32First()时返回FALSE,增加以下showErrMsg()来获取出错信息:

showErrMsg proc
    local dwMsgId: dword
    local lpBuf  : dword

    invoke GetLastError
    mov    dwMsgId,eax
    INVOKE FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER \
            + FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwMsgId, 0\
            , ADDR lpBuf, 0, NULL
    invoke StdOut, lpBuf
    invoke LocalFree, lpBuf
    ret
showErrMsg endp

得到的出错信息是:

程序发出命令,但命令长度不正确

估计是用Unicode版本引发的。

上MASM32论坛一看,已经有国外网友rsala发现了这个问题,他指出:MASM32 V11版本中的kernel32.inc、Kernel32.lib和kernl32p.inc、kernl32p.lib中的Module32First / Module32Next and Process32First / Process32Next这两对函数信息存在bug。按照Microsoft MSDN,这两对函数的ANSI版本不是Module32FirstA / Module32NextA nor Process32FirstA / Process32NextA,而是 Module32First / Module32Next and Process32First / Process32Next,在程序中调用以上两对函数的ANSI版时将会出现问题。

热心的网友并且提供了修正的kernel32.inc、Kernel32.lib和kernl32p.inc、kernl32p.lib文件下载。


相关文章
|
7月前
|
Unix Linux Python
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
|
7月前
|
Unix Linux Python
`subprocess`模块允许你启动新的应用程序,连接到它们的输入/输出/错误管道,并获取它们的返回码。
`subprocess`模块允许你启动新的应用程序,连接到它们的输入/输出/错误管道,并获取它们的返回码。
|
9月前
|
Shell Linux Windows
从您描述的情况来看,您在执行`exit`命令后,程序立即终止了
【2月更文挑战第32天】从您描述的情况来看,您在执行`exit`命令后,程序立即终止了
64 1
Mgo
|
Shell Go
go调用shell命令两种方式实现(有无返回值)
go调用shell命令两种方式实现(有无返回值)
Mgo
1641 1
|
Python
Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理
Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理
1194 0
|
Windows
WINDOWS调用出错后,得到信息字串
WINDOWS调用出错后,得到信息字串
54 0
|
Shell
shell之通过if [ $? != 0 ]判断上次程序是否执行成功
shell之通过if [ $? != 0 ]判断上次程序是否执行成功
724 0
|
MySQL 关系型数据库 Linux
linux下命令行执行后的返回值-错误值
我们最开始学习的C语言中,主函数中int main()函数的最后总会加一个return 0;充当返回值,当初我们并不知道这个返回值的意义是什么,我们经常使用的是普通函数中的返回值,当函数执行一个任务时,函数执行完毕之后总会返回一个适当的值来告诉执行者该函数执行的情况 Linux 下,在terminal下,控制台下运行命令,所有的命令在结束时,都会返回一个数字值,这个值即为返回值,每个返回值都对应着一个错误号,根据错误号我们可以大致推断这个函数执行的情况。
2045 0