找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 201|回复: 5

[分享] PECMD调用libwim-15.dll函数获取WIM/ESD映像文件信息

[复制链接]
发表于 昨天 19:45 | 显示全部楼层 |阅读模式
发现有不少基于 wimlib-imagex.exe 的使用 pecmd 编写的备份还原前端工具基本都是使用 wimlib-imagex.exe 的标准输出或提取 xml 文件去获取目标映像文件的信息
使用命令行去获取映像信息的效率其实比调用 api 要低很多, 因此就封装了这个函数(本人没啥编程基础, 代码质量可能比较差)
  1. ;参数1为目标映像文件路径, 参数2,3均用于存放返回信息; 返回信息其实可以用一个变量存放, 只是个人觉得分两个好像更清晰一些
  2. ;注意 libwim-15.dll 必须位于此脚本所在位置(也可以修改下面的代码, 以指定 libwim-15.dll 的具体位置)
  3. _SUB GetWimImageInfo
  4.     TEAM ENVI$ &NL=0d 0a| ENVI &ImagePath=%~1| ENVI &wim_info=| ENVI &image_info=
  5.     IFEX #%&bX64%=3, ENVI &PtrSz=8! ENVI &PtrSz=4
  6.     TEAM ENVI$# &pwim=*%&PtrSz% 0| ENVI$# &WimInfo=*221 0
  7.     CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_open_wim,$%&ImagePath%,#0,*&pwim
  8.     IFEX #%&ret%=0,
  9.     {
  10.         ENVI?ptr &pwim=&wim
  11.         CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_wim_info,#%&wim%,*&WimInfo
  12.         IFEX #%&ret%=0,
  13.         {
  14.             ENVI?int &WimInfo=&image_count:16
  15.             ENVI?int &WimInfo=&boot_index:20
  16.             ENVI?int &WimInfo=&chunk_size:28
  17.             ENVI?short &WimInfo=&part_number:32
  18.             ENVI?short &WimInfo=&total_parts:34
  19.             ENVI?int &WimInfo=&compression_type:36
  20.             ENVI?int64 &WimInfo=&total_bytes:40
  21.             ;此两行注释代码不知有何问题, 无法获得预期结果
  22.             ;CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_compression_type_string,#%&compression_type%
  23.             ;IFEX #%&ret%<>0,SET-mkfixdummy &ct=%&ret%! ENVI &ct=Unknown
  24.             IFEX #%&compression_type%=0,ENVI &ct=NONE! IFEX #%&compression_type%=1,ENVI &ct=XPRESS! IFEX #%&compression_type%=2,ENVI &ct=LZX! IFEX #%&compression_type%=3,ENVI &ct=LZMS
  25.             ENVI &wim_info=映像数量: %&image_count%%&NL%
  26.             ENVI &wim_info=%&wim_info%引导索引: %&boot_index%%&NL%
  27.             ENVI &wim_info=%&wim_info%块大小: %&chunk_size%%&NL%
  28.             ENVI &wim_info=%&wim_info%分卷数量: %&part_number%/%&total_parts%%&NL%
  29.             ENVI &wim_info=%&wim_info%压缩类型: %&ct%%&NL%
  30.             ENVI &wim_info=%&wim_info%映像大小: %&total_bytes%%&NL%
  31.             ENVI &Index=1
  32.             LOOP #%&Index%<=%&image_count%,
  33.             {
  34.                 ENVI &image_info=%&image_info%索引: %&Index%%&NL%
  35.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$NAME
  36.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Name=%&ret%| ENVI &image_info=%&image_info%名称: %&Name%%&NL%
  37.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DESCRIPTION
  38.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Description=%&ret%| ENVI &image_info=%&image_info%描述: %&Description%%&NL%
  39.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DISPLAYNAME
  40.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DisplayName=%&ret%| ENVI &image_info=%&image_info%显示名称: %&DisplayName%%&NL%
  41.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DISPLAYDESCRIPTION
  42.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DisplayDescription=%&ret%| ENVI &image_info=%&image_info%显示描述: %&DisplayDescription%%&NL%
  43.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DIRCOUNT
  44.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DirCount=%&ret%| ENVI &image_info=%&image_info%目录数: %&DIRCOUNT%%&NL%
  45.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$FILECOUNT
  46.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &FileCount=%&ret%| ENVI &image_info=%&image_info%文件数: %&FileCount%%&NL%
  47.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$TOTALBYTES
  48.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &TotalBytes=%&ret%| ENVI &image_info=%&image_info%总字节数: %&TotalBytes%%&NL%
  49.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/PRODUCTNAME
  50.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &ProductName=%&ret%| ENVI &image_info=%&image_info%产品名称: %&ProductName%%&NL%
  51.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/EDITIONID
  52.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &EditionID=%&ret%| ENVI &image_info=%&image_info%版本 ID: %&EditionID%%&NL%
  53.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/INSTALLATIONTYPE
  54.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &InstallationType=%&ret%| ENVI &image_info=%&image_info%安装类型: %&InstallationType%%&NL%
  55.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/PRODUCTTYPE
  56.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &ProductType=%&ret%| ENVI &image_info=%&image_info%产品类型: %&ProductType%%&NL%
  57.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/LANGUAGES/LANGUAGE
  58.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Language=%&ret%| ENVI &image_info=%&image_info%语言: %&Language%%&NL%
  59.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/LANGUAGES/DEFAULT
  60.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DefaultLanguage=%&ret%| ENVI &image_info=%&image_info%默认语言: %&DefaultLanguage%%&NL%
  61.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/SYSTEMROOT
  62.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &SystemRoot=%&ret%| ENVI &image_info=%&image_info%System Root: %&SystemRoot%%&NL%
  63.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/MAJOR
  64.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &MajorVersion=%&ret%| ENVI &image_info=%&image_info%主版本号: %&MajorVersion%%&NL%
  65.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/MINOR
  66.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &MinorVersion=%&ret%| ENVI &image_info=%&image_info%次版本号: %&MinorVersion%%&NL%
  67.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/BUILD
  68.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &BuildVersion=%&ret%| ENVI &image_info=%&image_info%构建号: %&BuildVersion%%&NL%
  69.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/SPBUILD
  70.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &SPBuild=%&ret%| ENVI &image_info=%&image_info%Service Pack Build: %&SPBuild%%&NL%
  71.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$FLAGS
  72.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Flags=%&ret%| ENVI &image_info=%&image_info%Flags: %&Flags%%&NL%
  73.                 CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WIMBOOT
  74.                 IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &WIMBoot=%&ret%| ENVI &image_info=%&image_info%WIMBoot 兼容: %&WIMBoot%%&NL%
  75.                 ENVI &image_info=%&image_info%%&NL%
  76.                 CALC #&Index = %&Index% + 1
  77.             }
  78.         }
  79.         CALL $--c --qd libwim-15.dll,wimlib_free,#%&wim%
  80.     }
  81.     ENVI-ret %~2=%&wim_info%
  82.     ENVI-ret %~3=%&image_info%
  83. _END

  84. ;示例
  85. GetWimImageInfo "F:\SystemImage\Win10_21H1_19043.1237_X64.esd" &1 &2
  86. MESS %&1%
  87. MESS %&2%
复制代码
PS: wimlib_wim_info 结构的大小, 我个人计算是 212 字节, 但一些程序好像是使用 221 字节, 又有些人使用 128 字节; 完全搞不懂该结构的实际大小应该是多少
发表于 昨天 21:29 | 显示全部楼层
不怎么明白
回复

使用道具 举报

发表于 昨天 21:29 | 显示全部楼层
不错,支持
回复

使用道具 举报

发表于 昨天 22:18 | 显示全部楼层
本帖最后由 wintoflash 于 2026-5-3 23:22 编辑

Snipaste_2026-05-03_23-16-04.png

你算的 212 字节应该是错误的。
  1.         uint32_t has_integrity_table : 1;

  2.         /** 1 iff this info struct is for a ::WIMStruct that has a backing file.
  3.          */
  4.         uint32_t opened_from_file : 1;

  5.         /** 1 iff this WIM file is considered readonly for any reason (e.g. the
  6.          * "readonly" header flag is set, or this is part of a split WIM, or
  7.          * filesystem permissions deny writing)  */
  8.         uint32_t is_readonly : 1;

  9.         /** 1 iff the "reparse point fix" flag is set in this WIM's header  */
  10.         uint32_t has_rpfix : 1;

  11.         /** 1 iff the "readonly" flag is set in this WIM's header  */
  12.         uint32_t is_marked_readonly : 1;

  13.         /** 1 iff the "spanned" flag is set in this WIM's header  */
  14.         uint32_t spanned : 1;

  15.         /** 1 iff the "write in progress" flag is set in this WIM's header  */
  16.         uint32_t write_in_progress : 1;

  17.         /** 1 iff the "metadata only" flag is set in this WIM's header  */
  18.         uint32_t metadata_only : 1;

  19.         /** 1 iff the "resource only" flag is set in this WIM's header  */
  20.         uint32_t resource_only : 1;

  21.         /** 1 iff this WIM file is pipable (see ::WIMLIB_WRITE_FLAG_PIPABLE).  */
  22.         uint32_t pipable : 1;
  23.         uint32_t reserved_flags : 22;
复制代码

uint32_t pipable : 1 表示占了uint32_t的一个比特,uint32_t reserved_flags : 22表示占了uint32_t的22个比特。这些合起来共占了32个比特,也就是4字节。
你应该是把它们当成数组了,结果 88 - 4 + (10 + 22) * 4 = 212
回复

使用道具 举报

发表于 昨天 22:51 | 显示全部楼层
楼主再配个图来看看
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
太好啦,萬分感謝版主的無私發佈分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-5-4 05:54

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表