|
|
本帖最后由 Bluebells 于 2026-5-4 10:34 编辑
发现有不少基于 wimlib-imagex.exe 的使用 pecmd 编写的备份还原前端工具基本都是使用 wimlib-imagex.exe 的标准输出或提取 xml 文件去获取目标映像文件的信息
使用命令行去获取映像信息的效率其实比调用 api 要低很多, 因此就封装了这个函数(本人没啥编程基础, 代码质量可能比较差)
- ;参数1为目标映像文件路径, 参数2,3均用于存放返回信息; 返回信息其实可以用一个变量存放, 只是个人觉得分两个好像更清晰一些
- ;注意 libwim-15.dll 必须位于此脚本所在位置(也可以修改下面的代码, 以指定 libwim-15.dll 的具体位置)
- _SUB GetWimImageInfo
- TEAM ENVI$ &NL=0d 0a| ENVI &ImagePath=%~1| ENVI &wim_info=| ENVI &image_info=
- IFEX #%&bX64%=3, ENVI &PtrSz=8! ENVI &PtrSz=4
- TEAM ENVI$# &pwim=*%&PtrSz% 0| ENVI$# &WimInfo=*88 0
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_open_wim,$%&ImagePath%,#0,*&pwim
- IFEX #%&ret%=0,
- {
- ENVI?ptr &pwim=&wim
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_wim_info,#%&wim%,*&WimInfo
- IFEX #%&ret%=0,
- {
- ENVI?int &WimInfo=&image_count:16
- ENVI?int &WimInfo=&boot_index:20
- ENVI?int &WimInfo=&chunk_size:28
- ENVI?short &WimInfo=&part_number:32
- ENVI?short &WimInfo=&total_parts:34
- ;分卷信息如果想显示为十进制格式而不是十六进制格式, 可以将上面的两行代码替换为下面的两行代码(记得移除注释符号)
- ;ENVI?int &WimInfo=&part_info:32
- ;TEAM CALC #&part_number = %&part_info% & 0xFFFF| CALC #&total_parts = shr(%&part_info%,16)
- ENVI?int &WimInfo=&compression_type:36
- ENVI?int64 &WimInfo=&total_bytes:40
- ;此两行注释代码不知是否语法有误, 因此无法获得预期结果
- ;CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_compression_type_string,#%&compression_type%
- ;IFEX #%&ret%<>0,SET-mkfixdummy &ct=%&ret%! ENVI &ct=Unknown
- 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
- ENVI &wim_info=映像数量: %&image_count%%&NL%
- ENVI &wim_info=%&wim_info%引导索引: %&boot_index%%&NL%
- ENVI &wim_info=%&wim_info%块大小: %&chunk_size%%&NL%
- ENVI &wim_info=%&wim_info%分卷信息: %&part_number%/%&total_parts%%&NL%
- ENVI &wim_info=%&wim_info%压缩类型: %&ct%%&NL%
- ENVI &wim_info=%&wim_info%映像大小: %&total_bytes%%&NL%
- ENVI &Index=1
- LOOP #%&Index%<=%&image_count%,
- {
- ENVI &image_info=%&image_info%索引: %&Index%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$NAME
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Name=%&ret%| ENVI &image_info=%&image_info%名称: %&Name%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DESCRIPTION
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Description=%&ret%| ENVI &image_info=%&image_info%描述: %&Description%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DISPLAYNAME
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DisplayName=%&ret%| ENVI &image_info=%&image_info%显示名称: %&DisplayName%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DISPLAYDESCRIPTION
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DisplayDescription=%&ret%| ENVI &image_info=%&image_info%显示描述: %&DisplayDescription%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$DIRCOUNT
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DirCount=%&ret%| ENVI &image_info=%&image_info%目录数: %&DIRCOUNT%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$FILECOUNT
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &FileCount=%&ret%| ENVI &image_info=%&image_info%文件数: %&FileCount%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$TOTALBYTES
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &TotalBytes=%&ret%| ENVI &image_info=%&image_info%总字节数: %&TotalBytes%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/PRODUCTNAME
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &ProductName=%&ret%| ENVI &image_info=%&image_info%产品名称: %&ProductName%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/EDITIONID
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &EditionID=%&ret%| ENVI &image_info=%&image_info%版本 ID: %&EditionID%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/INSTALLATIONTYPE
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &InstallationType=%&ret%| ENVI &image_info=%&image_info%安装类型: %&InstallationType%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/PRODUCTTYPE
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &ProductType=%&ret%| ENVI &image_info=%&image_info%产品类型: %&ProductType%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/LANGUAGES/LANGUAGE
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Language=%&ret%| ENVI &image_info=%&image_info%语言: %&Language%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/LANGUAGES/DEFAULT
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &DefaultLanguage=%&ret%| ENVI &image_info=%&image_info%默认语言: %&DefaultLanguage%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/SYSTEMROOT
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &SystemRoot=%&ret%| ENVI &image_info=%&image_info%System Root: %&SystemRoot%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/MAJOR
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &MajorVersion=%&ret%| ENVI &image_info=%&image_info%主版本号: %&MajorVersion%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/MINOR
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &MinorVersion=%&ret%| ENVI &image_info=%&image_info%次版本号: %&MinorVersion%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/BUILD
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &BuildVersion=%&ret%| ENVI &image_info=%&image_info%构建号: %&BuildVersion%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WINDOWS/VERSION/SPBUILD
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &SPBuild=%&ret%| ENVI &image_info=%&image_info%Service Pack Build: %&SPBuild%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$FLAGS
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &Flags=%&ret%| ENVI &image_info=%&image_info%Flags: %&Flags%%&NL%
- CALL $--c --qd --ret:&ret libwim-15.dll,wimlib_get_image_property,#%&wim%,#%&Index%,$WIMBOOT
- IFEX #%&ret%<>0,TEAM ENVI-mkfixdummy &WIMBoot=%&ret%| ENVI &image_info=%&image_info%WIMBoot 兼容: %&WIMBoot%%&NL%
- ENVI &image_info=%&image_info%%&NL%
- CALC #&Index = %&Index% + 1
- }
- }
- CALL $--c --qd libwim-15.dll,wimlib_free,#%&wim%
- }
- ENVI-ret %~2=%&wim_info%
- ENVI-ret %~3=%&image_info%
- _END
- ;示例
- GetWimImageInfo "F:\SystemImage\Win10_21H1_19043.1237_X64.esd" &1 &2
- MESS %&1%
- MESS %&2%
复制代码 PS: 感谢 wintoflash 详解 wimlib_wim_info 结构各个成员的大小!
|
|