MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

article/2025/9/26 16:09:26

SysInfo主要是通过WMI来获取系统信息的,但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容,所以需要另外想办法编程获取,比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32和VC分别编写了调用GetNativeSystemInfo()的代码。详见:MASM32编程访问结构体成员要注意的一点icon-default.png?t=M85Bhttps://blog.csdn.net/Purpleendurer/article/details/128063894?spm=1001.2014.3001.5501

今天把32or64.asm中的相关代码移植到SysInfo中来显示,主要是把32or64.asm中的相关代码改为一个函数showOsType(),原来的一些全局变量相应改成函数内部的局部变量,代码如下:

    g_szOsType                  db    "系统类型:", 0g_sz32Bit                   db    "32位",0g_sz64Bit                   db    "64位",0g_szGetNativeSystemInfo     db    "GetNativeSystemInfo", 0g_szkernel32Dll             db    "kernel32.dll", 0g_szFailGetModuleHandle     db    "GetModuleHandle失败", 0g_szFailGetProcAddress      db    "GetProcAddress失败", 0g_szFailGetNativeSystemInfo db    "GetNativeSystemInfo失败", 0showOsType procLOCAL lpSI: dwordLOCAL lpfnGetNativeSystemInfo: _LPFNGetNativeSystemInfoinvoke editCatStr, OFFSET g_szOsTypeinvoke GetModuleHandle, OFFSET g_szkernel32Dll.if    eax==NULLpush OFFSET g_szFailGetModuleHandle .elseinvoke GetProcAddress, eax, OFFSET g_szGetNativeSystemInfo.IF eax==NULLpush   OFFSET g_szFailGetProcAddress ; for call editCatStr().ELSEmov    lpfnGetNativeSystemInfo, eax invoke lpfnGetNativeSystemInfo, ADDR lpSI                               lea    eax, lpSImovzx eax, (_SYSTEM_INFO ptr [eax]).wProcessorArchitecture.if (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)push OFFSET g_sz64Bit.elsepush OFFSET g_sz32Bit.endif.ENDIF.endifcall editCatStr ;invoke editCatStr, eaxret
showOsType endp

修改的程序汇编连接正常,运行时可以正常显示Windows操作系统类型是32位还是64位的,但显示完这行信息后停滞了一下,随后SysInfo窗口就没有任何提示地自动关闭了。

 

用OllyDbg跟踪了代码运行情况,代码运行正常,可以获得正确的操作系统类型信息,但是在函数执行结束返回时出现了访问异常。

还是第一次遇到这种情况,为了弄清楚原因,把showOsType()代码拿出来单独测试,代码如下:

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FileName: WinBit.asm
; Function: Show windows bit with API GetNativeSystemInfo
;   Author: PurpleEndurer
;   DevEnv: Windows 10  + MASM32
; 
; Log:
;---------------------------------------------------------------
;  20221216 Created
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.model     flat, stdcall
option     casemap:none
include    \masm32\include\windows.inc
include    \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include    \masm32\include\user32.inc
includelib \masm32\lib\user32.lib;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;proto
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
_GetNativeSystemInfo     TYPEDEF proto :DWORD
_LPFNGetNativeSystemInfo TYPEDEF Ptr _GetNativeSystemInfoshowOsType           proto;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;.const
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;PROCESSOR_ARCHITECTURE_INTEL   equ 0      ;x86
;PROCESSOR_ARCHITECTURE_ARM     equ 5      ;ARM
;PROCESSOR_ARCHITECTURE_IA64    equ 6      ;基于 Intel Itanium 的
;PROCESSOR_ARCHITECTURE_AMD64   equ 9      ;x64 (AMD 或 Intel)
PROCESSOR_ARCHITECTURE_ARM64    equ 12     ;ARM64
;PROCESSOR_ARCHITECTURE_UNKNOWN equ 0ffffh ;未知体系结构。;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;.data
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
.code
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssg_szOsType                  db    "系统类型:", 0g_sz32Bit                   db    "32位",0g_sz64Bit                   db    "64位",0g_szGetNativeSystemInfo     db    "GetNativeSystemInfo", 0g_szkernel32Dll             db    "kernel32.dll", 0g_szFailGetModuleHandle     db    "GetModuleHandle失败", 0g_szFailGetProcAddress      db    "GetProcAddress失败", 0g_szFailGetNativeSystemInfo db    "GetNativeSystemInfo失败", 0showOsType procLOCAL lpSI: dwordLOCAL lpfnGetNativeSystemInfo: _LPFNGetNativeSystemInfoinvoke GetModuleHandle, OFFSET g_szkernel32Dll.if    eax==NULLmov eax, OFFSET g_szFailGetModuleHandle .elseinvoke GetProcAddress, eax, OFFSET g_szGetNativeSystemInfo.IF eax==NULLmov eax, OFFSET g_szFailGetProcAddress.ELSEmov   lpfnGetNativeSystemInfo, eaxinvoke lpfnGetNativeSystemInfo, ADDR lpSIlea   eax, lpSImovzx eax, (SYSTEM_INFO ptr [eax]).wProcessorArchitecture.if (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)mov eax, OFFSET g_sz64Bit   ; push OFFSET g_sz64Bit.elsemov eax, OFFSET g_sz32Bit   ; push OFFSET g_sz32Bit.endif.ENDIF.endifpush eaxinvoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK
pop eaxret
showOsType endpmain  procinvoke showOsTypeinvoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OKinvoke ExitProcess, NULLmain endpend main

代码汇编连接成功,运行时正常显示showOsType()中

invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK

显示的信息框:

然后就出现问题了:

E xception 000006BA . exception is non-continuable

 

 main()函数中的

invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK

 并没有得到执行,显示出信息框来。

开始百思不得其解,后面重新研究了GetNativeSystemInfo的参数说明:

参数

[out] lpSystemInfo

指向接收信息的 SYSTEM_INFO 结构的指针。

我代码中传递GetNativeSystemInfo()的参数dword类型变量lpSI,其值没有初始化,而不是指向一个SYSTEM_INFO结构的地址(指针)。这样GetNativeSystemInfo函数返回的SYSTEM_INFO结构信息数据覆盖了函数返回信息数据,导致函数结束返回时跳到了错误的地址,引发异常。

原来如此,看来lpSI定义为全局变量没有出现问题纯属侥幸。写代码一定要看清楚函数原型和说明。

参考:

GetNativeSystemInfo 函数 (sysinfoapi.h)


http://chatgpt.dhexx.cn/article/exTvcf68.shtml

相关文章

系统信息:uname,sysinfo,gethostname,sysconf

且欲近寻彭泽宰&#xff0c;陶然共醉菊花怀。 文章目录 系统信息系统标识 unamesysinfo 函数gethostname 函数sysconf()函数 系统信息 系统标识 uname 系统调用 uname()用于获取有关当前操作系统内核的名称和信息&#xff0c;函数原型如下所示&#xff08;可通过"man 2 …

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 使用Django&#xff0c;搭建sysinfo&#xff0c;Linux中,sysinfo是用来获取系统相关信息的结构体 本篇基于&#xff1a;https://github.com/hypersport/sysinfo#readme项目借鉴路径: https://gi…

SysInfo(电脑系统信息)0.0.0.1beta2

文件说明符 : D:\masm32\wmi\sysInfo\sysInfo0.0.0.1beta2.exe 属性 : A--- 数字签名:否 PE文件:是 语言 : 中文(简体&#xff0c;中国) 文件版本 : 0.0.0001 beta2 说明 : 电脑系统信息 版权 : PurpleEndurer 产品版本 : 0.0.0001 beta2 产品名称 : 电脑系统信息 公司名称 : P…

sysinfo函数、结构体使用

1&#xff0c;头文件&#xff1a; #include <sys/sysinfo.h>2&#xff0c;函数声明&#xff1a; int sysinfo(struct sysinfo *info);3&#xff0c;返回值&#xff1a; 成功返回0&#xff0c;错误返回-1&#xff1b; 4&#xff0c;sysinfo结构体名称 Linux 2.3.23(i38…

Linux中sysinfo的用法

sysinfo结构体 Linux中,可以用sysinfo来获取系统相关信息。 Linux中,sysinfo是用来获取系统相关信息的结构体。 函数声明和原型&#xff1a; #include <sys/sysinfo.h> int sysinfo(struct sysinfo *info); 在Linux中不同对版本结构体不一样 在Linux 2.3.16中&#…

sysinfo 函数

在linux系统中&#xff0c;我们可以使用sysinfo()获取一些系统统计信息。我们在终端命令行中输入“man 2 sysinfo”即可获取sysinfo()的详细信息&#xff0c;如下图所示。 从上图可以知道&#xff0c;使用uname需要包含头文件"#include <sys/sysinfo.h>" sysi…

natapp

简介 natapp是一个内网穿透工具&#xff0c;内网穿透也叫做内网映射&#xff0c;也叫“NAT穿透”&#xff0c;所谓内网穿透简单来说就是让外网能够访问内网&#xff0c;即把自己的电脑当服务器&#xff0c;让别人能够访问自己的电脑。 使用 1、注册一个账号&#xff0c;并且进…

WAP PUSH

PUSH &#xff08;WAP-PUSH&#xff09;又叫做服务信息或推入信息&#xff0c;是一种特殊格式的短信。 目录 基本简介 特点优势 系统框架 推送协议 推送服务方式 短消息网关简介 基于短信网关发送WAP PUSH wapPDU 模式 分析 良好前景 基本简介 特点优势 系统框架 推送协议 推送…

睡眠 应该用 a加权 c加权_时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用...

本应用实践平台为BigQuant人工智能量化平台 为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。…

【Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议)】

Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议) 需要IOS开发提供的信息 1.推送证书,.p8格式的文件 2.bundleId 3.keyId 4.teamId MAVEN依赖 <dependency><groupId>com.eatthepath</groupId><artifactId>pushy</artifactId>…

HTAP 简介

2019独角兽企业重金招聘Python工程师标准>>> HTAP的定义 数据库系统一般可以按照负载类型分成操作型数据库(Operational Support System)和决策型数据库(Decision Support System)。操作型数据库主要用于应对日常流水类业务,主要是面向消费者类的业务;决策型数…

爬取twitter数据--使用twint

最近因为实验验证的需要&#xff0c;想要爬取推特的数据&#xff0c;首先想到的是通过推特官方的开发者计划拿到key然后直接爬取&#xff0c;连接如下&#xff1a; twitter myapp 但是问题就在于&#xff0c;这玩意我用两个号申请都被拒绝了&#xff0c;据说是86的号码被拒就是…

tweepy抓取Twitter数据

Tweepy是Twitter官方提供的Python第三方开发库&#xff0c;简单好用易学高效&#xff01; 安装的流程很简单&#xff0c;如果你和我一样的win10_64bit用户&#xff0c;如果你配置了pip管理器&#xff0c;在你的终端里输入 >> pip install tweepy 就会自动安装好了 我们先…

【PWA学习】4. 使用 Push API 实现消息推送

引言 在接下来的内容里&#xff0c;我们会探究 PWA 中的另一个重要功能——消息推送与提醒(Push & Notification)。这个能力让我们可以从服务端向用户推送各类消息并引导用户触发相应交互 Web Push 效果 Push API 和 Notification API 其实是两个独立的技术&#xff0c;完全…

TWAMP 协议

使用标准协议测量IP网络性能始终是一项挑战。IP发明者曾作为TCP/IP协议套件的一部分提供了一些工具,如Internet控制消息协议(ICMP)Ping、Traceroute和用户数据报协议(UDP)Echo。但是,这些工具并不是为执行总体性能测试而准备的,而是设计用于简单排查IP网络故障。因此,企…

HTAP技术

传统业务采取隔天隔天将数据抽取到OLAP的方式&#xff0c;带来了两个问题 1&#xff0c; 报表往往需要隔天才能出来&#xff0c;无法满足业务需要&#xff1b; 2&#xff0c;带来了多副本的问题&#xff1b; OLTP里面至少三个副本&#xff1b; OLAP里面又至少3个副本&#xf…

【区块链 | Uniswap】3.剖析DeFi交易产品之Uniswap:V2下篇

前言 上篇我们主要讲了 UniswapV2 整体分为了哪些项目&#xff0c;并重点讲解了 uniswap-v2-core 的核心代码实现&#xff1b;中篇主要对 uniswap-v2-periphery 的路由合约实现进行了剖析&#xff1b;现在剩下 V2 系列的最后一篇&#xff0c;我会介绍剩下的一些内容&#xff0…

量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)

参考文献&#xff1a; https://en.wikipedia.org/wiki/Time-weighted_average_price https://en.wikipedia.org/wiki/Volume-weighted_average_price http://blog.sina.com.cn/s/blog_163a2b9700102wdy0.html https://www.douban.com/note/214362575 算法交易其实主要是用在…

用高频交易的方式对TWAP算法优化(TWAP算法、算法实现、高频交易、冰山算法)

用高频交易的方式对TWAP算法进行优化。 以下内容主要基于执行算法的讨论。 什么是TWAP算法&#xff08;时间加权平均价格&#xff09;&#xff1f; TWAP交易时间加权平均价格Time Weighted Average Price 模型是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时…

算法交易简介以及TWAP、VWAP算法原理

算法交易视频&#xff1a;算法交易视频 1&#xff0c;交易成本&#xff1a; 交易成本分成两类&#xff0c;一类是显性成本&#xff0c;包括佣金&#xff08;包括券商佣金&#xff08;券商收取&#xff09;&#xff0c;交易经手费&#xff08;交易所收取&#xff0c;千分之0.0…