• 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
    ENDIF


    Process32NextW PROTO STDCALL :DWORD,:DWORD
    IFDEF __UNICODE__
      Process32Next equ
    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文件下载,CSDN上的下载地址如下:

    MASM32v11版本中kernel32.inc和Kernel32.lib修正版。-C++文档类资源-CSDN文库

    MASM32v11中的kernl32p.inc和kernl32p.lib存在bug,这是修正后的版本。-C++文档类资源-CSDN文库

  • 相关阅读:
    逻辑漏洞笔记
    【优化调度】基于蜜蜂算法实现经济调度问题附matlab代码
    菜菜学paddle第四篇:改进卷积神经网络构建手写数字识别
    LeetCode 376. 摆动序列
    python openpyxl excel库
    java-net-php-python-springboot宿舍管理计算机毕业设计程序
    聊聊使用场景法进行性能测试
    模拟卷Leetcode【普通】061. 旋转链表
    RISC-V汇编
    IIS解析漏洞复现
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/126081342