用MASM32编程更新sysInfo的一些收获

news2024/12/23 3:30:40

近日正在更新用MASM32编写的sysInfo,通过WMI访问Win32_UserCount来获取系统用户帐号信息,访问Win32_Product来获取系统中安装的产品信息。

在进行更新过程中,有一些新的收获跟大家分享。

一、HTML+JavaScript构建C++类代码一键转换MASM32代码平台

在MASM32中使用WMI访问这些对象及其成员,必须用Unicode DW 字符串。比如要访问Win32_Product对象:

[Provider("MSIProv"), Dynamic]
class Win32_Product : CIM_Product
{
  uint16   AssignmentType;
  string   Caption;
  string   Description;
  string   IdentifyingNumber;
  string   InstallDate;
  datetime InstallDate2;
  string   InstallLocation;
  sint16   InstallState;
  string   HelpLink;
  string   HelpTelephone;
  string   InstallSource;
  string   Language;
  string   LocalPackage;
  string   Name;
  string   PackageCache;
  string   PackageCode;
  string   PackageName;
  string   ProductID;
  string   RegOwner;
  string   RegCompany;
  string   SKUNumber;
  string   Transforms;
  string   URLInfoAbout;
  string   URLUpdateInfo;
  string   Vendor;
  uint32   WordCount;
  string   Version;
};

 那对象名称Win32_Product要定义为:

g_wszWin32_Product dw "W","i","n","3","2","_","P","r","o","d","u","c","t",0,0

其中的成员,如AssignmentType,要定义为:

g_wszAssignmentType	dw	'A','s','s','i','g','n','m','e','n','t','T','y','p','e', 0, 0

虽然MASM32 在其自带的准开发环境QEDITOR 的 Conversions菜单中里提供了Text to DW UNICODE菜单项功能,但这个菜单项还不能实现自动从类中提出成员属性名称并转换为MASM32的DW UNICODE字符串的格式,所以我们还是先得手工将AssignmentType、Caption……提取出来。当对象成员很多的时候,不仅工作量大,而且还容易出错。为此,我用HTML+Javascript写了一个转换工具来完成这些工作,详见:

HTML+JavaScript构建C++类代码一键转换MASM32代码平台

 

 

二、对象成员有效性随Windows版本而异

Win32_Product等对象虽然定义没有变,但其中的成员属性的有效性会因Windows版本而异。

比如Win32_Product对象中的的InstallDate就不再有效,由InstallDate2来替代。

但InstallDate2的有效性会因Windows版本而异,初步测试发现这个属性在Windows XP上有效,在Windows 7 、Windows 10上似乎无效。

要想保证程序在各个版本的Windows上正确运行,还需要逐一测试。

三、Locale ID(区域性标识符)

测试发现Win32_Product对象的成员Language

Language

Data type: string

Access type: Read-only

The language of the product.

Windows Server 2003: This property is not available.

在Windows XP、和Windows 10均有效,它返回的是产品的Locale ID(区域性标识符)字符串,最常见的就是2052对应的是简体中文Chinese (Simplified)People's Republic of China,1033对应的是英文(美国)。

比如中文就有下面这些:

Language

Location (or type)

Language ID(Hex)

Language ID(Dec)

Language tag

Supported version

Chinese (Simplified)

0x0004

4

zh-Hans

Release A

Chinese (Simplified)

0x7804

30724

zh

Windows 7

Chinese (Simplified)

People's Republic of China

0x0804

2052

zh-CN

Release A

Chinese (Simplified)

Singapore

0x1004

4100

zh-SG

Release A

Chinese (Traditional)

0x7C04

31748

zh-Hant

Release A

Chinese (Traditional)

Hong Kong Special Administrative Region

0x0C04

3076

zh-HK

Release A

Chinese (Traditional)

Macao S.A.R.

0x1404

5124

zh-MO

Release D

Chinese (Traditional)

Taiwan

0x0404

1028

zh-TW

Release A

更详细的信息可参考:5 Appendix A: Product Behavior

如果我们要精确将这些中文区域性标识符区分出来,直接进行字符串比较运算量就大了,我们可以把字符串转换为对应的数字,再进行比较,运算量会小一些。

要实现字符串转换为对应的数字,可以使用Windows API函数:StrToIntEx():

BOOL StrToIntExA(
  [in]  PCSTR      pszString,
        STIF_FLAGS dwFlags,
  [out] int        *piRet
);

详见微软网官的说明:StrToIntExA function (shlwapi.h) - Win32 apps | Microsoft Learn

我们也可以自己写一个程序来进行转换,比如下面这个网友分享的字符串转数值函数:

;======================================================
str2num proc uses ebx ecx edx esi edi
;======================================================
    ; In: eax, offset to str_num
    ; out: eax, the number converted

    mov     edi, eax  ; offset
    xor     eax, eax  ;mov     eax, 0
    mov     ecx, cdMaxSize
    repne   scasb
    jne     @NoFound
    sub     edi, 2
    sub     ecx, cdMaxSize
    neg     ecx
    mov     ebx, 1                ; factor
    mov     esi, 0                ; Acumulative
@Next:
    dec     ecx
    jl      @Exit
    xor     eax, eax            ; clear it
    mov     al, byte ptr [edi]
    and     al, 15              ; 2num
    mul     ebx
    add     esi, eax            ; get into accumulative
    mov     eax, ebx            ; increases factor
    mov     ebx, 10
    mul     ebx
    mov     ebx, eax
    dec     edi                 ; reset pointer
    jmp     @Next
@Exit:
    mov     eax, esi
@NoFound:
    ret
str2num endp

需要注意的是,这个函数没有考虑字符串中掺杂其它字符的情况,比如字符串末尾有回车、换行符的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中科方德4.0服务器 默认自动分区,扩容根分区方法

先看分区情况是否为非LVM的ext4,方德默认自动分配即是此种分区;外部添加磁盘空间,虚拟机或者物理机一样;图形化扩展到逻辑分区,如图中所示的扩展分区;home分区扩展;home分区尾部留出新home分区&…

iOS 17 正式版预计 9 月中下旬发布,部分新功能延后推出

苹果公司预计将在 9 月中下旬推出 iOS 17 正式版,iPhone XS 及更新的机型可免费更新。这次更新包含了许多新功能,但是根据苹果公司的网站显示,并不是所有的功能都会立即可用。苹果表示有一些功能“将在今年晚些时候推出”,比如&am…

springboot里 运用 easyexcel 导出

引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…

基线与基线检查

目录 一、什么是基线 二、安全基线与配置核查 三、常见安全配置问题 四、配置检查目的 五、配置检查标准 六、基线检查标准 七、安全基线与漏扫的异同 相同点 不同点 八、安全基线体系 九、安全配置核查关注什么 口令策略 文件权限 用户账户 系统服务 认证授权 网络通…

【Docker】Docker安装 MySQL 8.0,简洁版-快速安装使用

今天&#xff0c;使用docker安装mysql数据库进行一个测试&#xff0c;结果网上找了一篇文章&#xff0c;然后。。。。坑死我… 特总结本篇安装教程&#xff0c;主打一个废话不多说&#xff01; 坑&#xff1a;安装成功&#xff0c;客户端工具连接不上数据库》。。。 正文&…

复习3-5天【80天学习完《深入理解计算机系统》】第七天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Python入门--关键字

关键字是Python编程语言中具有特殊含义的保留单词&#xff0c;不能用作变量名、函数名、类名或其他标识符。以下是Python 3.9.0版本中的关键字列表&#xff1a; False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, f…

图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…

香蕉派 BPI-P2 Pro采用RK3308芯片,512M内存,8G存储,支持PoE供电

Banana Pi BPI-P2 pro(Armsom pro)是一款基于瑞芯瑞(Rockchip) RK3308B-S芯片的开发板。采用高性能4核ARM Cortex-A35处理器&#xff0c;512M RAM内存。和8G eMMC板载存储&#xff0c;支持PoE网线供电功能。芯片具有丰富的接口&#xff0c;如I2S、PCM、TDM、I2C、UART、SPDIF、…

Linux学习之iptables的nat表

iptables -t nat 命令 规则链 规则是格式命令。 PREROUTING一般用于内网&#xff0c;用于目的地址转换。 POSTROUTING一般用于外网&#xff0c;用于源地址转换。 iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0…

Pandas+Pyecharts | 电子产品销售数据分析可视化+用户RFM画像

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 数据信息2.3 去掉部分用不到的列2.4 去除重复数据2.5 增加部分时间列2.6 过滤数据&#xff0c;也可以选择均值填充2.7 对年龄分组2.8 增加商品一、二级分…

系统公告 | 用Navicat就可以访问应用数据库啦~

“超能力”数据库&#xff5e;拿来即用&#xff0c;应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库&#xff08;表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维&#xff09;&#xff0c;很大地降低开发者的使用门槛。 MemFire …

喜报!YCloud荣升WhatsApp Select等级商业解决方案提供商

即日起&#xff0c;云片国际站YCloud正式成为WhatsApp Select等级BSP&#xff08;商业解决方案提供商&#xff09;。2022年10月&#xff0c;YCloud获得Meta大中华地区首批BSP资格。通过YCloud团队不断追求卓越&#xff0c;专注为客户构建创新的通信解决方案的专业服务&#xff…

暴力破解

1、暴力破解 基于表单的暴力破解 使用bp抓包 我们要破解username和password&#xff0c;就应当选取Cluster bomb的攻击方式&#xff0c;在payloads中上传我们的字典&#xff0c;首先在payload set 1中上传username的字典&#xff0c;再选取payload set 2上传password的字典。 …

多线程-死锁

/*** 死锁demo*/ public class DeadlockDemo {public static void main(String[] args) {// 创建两个对象final Object resource1 "resource1";final Object resource2 "resource2";// 创建第一个线程Thread t1 new Thread(() -> {// 尝试锁定resour…

pe文件之手工构建节表(段表)和节的具体内容

一、实验目的 通过使用winHex手动 在原来的文件中 追加节&#xff08;.text代码节、.rdata引入函数节、.data数据节&#xff09;&#xff0c;然后利用stud_pe添加节表的name,大小等信息&#xff0c;对一个pe文件进行修复&#xff0c;从而了解一个pe文件的具体构成 二、实验步骤…

免费AI学习网站(二)

国内绘画midjourney网站 http://aijiaolian.chat优质提示词分解教学 https://q3iylvv7qj.feishu.cn/docx/UGMzdPVGjo1fHcxu1kjcuXFcnff?fromfrom_copylink设计图AI实战&#xff0c;如何用AI提高83%的出图效率&#xff1f;https://q3iylvv7qj.feishu.cn/docx/Fsxxd3MncowFUix5…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式&#xff0c;它们有以下区别&#xff1a; 同步请求&#xff1a; 在发送一个请求后&#xff0c;程序会一直等待服务器返回响应&#xff0c;期间无法进行其他操作。请求发出后&#xff0c;程序会阻塞在请求处&#xff0c;直…

深入剖析:如何通过API优化云计算架构?快来看!

在当今数字化时代&#xff0c;云计算已经成为企业实现创新、提高效率和降低成本的核心策略之一。而在构建和管理云计算架构时&#xff0c;API&#xff08;应用程序编程接口&#xff09;的作用变得愈发重要。本文将深入探讨如何通过API优化云计算架构&#xff0c;实现更高效、灵…

深入探索 Java 8 新特性:Lambda 表达式

深入探索 Java 8 新特性&#xff1a;Lambda 表达式 ​ 在软件开发领域&#xff0c;不断的进步和创新是推动技术发展的关键。Java 8 作为一个重要的版本&#xff0c;引入了许多令人兴奋的新特性&#xff0c;其中最受瞩目的之一就是 Lambda 表达式。Lambda 表达式的引入使得 Jav…