无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: lxl1638
打印 上一主题 下一主题

[V1.30.2011.501版]WimTool -- Wim文件的图形视窗处理工具[无忧首发]

    [复制链接]
301#
 楼主| 发表于 2008-2-12 14:20:03 | 显示全部楼层
SP3?或者这里有问题?
你将出现蓝屏的WIM解开到NTFS分区,再打包成WIM试试,或者你原来的WIM来源于FAT分区。

另外,你将WimTool.DLL和WimShExt.DLL放在什么位置?(如果不作任何设置,不能放在光区上,要放在NTFS分区中)。
系统的临时目录又在什么位置?不能用RAMDISK作临时文作夹。

[ 本帖最后由 lxl1638 于 2008-2-12 02:22 PM 编辑 ]
回复

使用道具 举报

302#
 楼主| 发表于 2008-2-12 14:25:31 | 显示全部楼层
下载了2000多份,其他人也将测试结果发上来,是否出现蓝屏或者可以正常使用或者有何建议,都说明一下。
回复

使用道具 举报

303#
 楼主| 发表于 2008-2-13 12:40:36 | 显示全部楼层
V1.08.02.12F版更新:
1、WimTool.EXE 支持设置真彩色图标;
2、WimShExt.DLL 除支持个性化图标外,还支持注册表中默认图标;
  先个性化图标,若没有设置先个性化图标,再设置注册表中默认图标
3、去掉了 WimShExt.DLL 中的资源图标,WimShExt.DLL 由21K精简到18K;
4、附件中附有DLL的注册方法和两个带有图标的小工具(示例);
回复

使用道具 举报

304#
 楼主| 发表于 2008-2-13 12:49:58 | 显示全部楼层
原帖由 nn2nn 于 2008-2-13 12:46 PM 发表
3、去掉了 WimShExt.DLL 中的资源图标,WimShExt.DLL 由21K精简到18K;

这个好。


有空你做一个专门的工具,将ICON写入WIM的XMLINFO内,或者可以在你原来的工具中加多一个选项,选择不同的方式写入WIM的ICON。
一种是你原来的方式,写到WIM后面;二是写在XML内。
回复

使用道具 举报

305#
 楼主| 发表于 2008-2-13 12:57:10 | 显示全部楼层
在XML内不能以RES方式写入,XML内只能是字符串数据,所以要将ICON数据转成BASE64编码,以BASE64编码形式写入,WimShExt.DLL内置了BASE64解码功能。BASE64编码的Delphi函数本人已发在论坛中。

[ 本帖最后由 lxl1638 于 2008-2-13 12:58 PM 编辑 ]
回复

使用道具 举报

306#
 楼主| 发表于 2008-2-13 13:03:16 | 显示全部楼层
原帖由 nn2nn 于 2008-2-13 12:59 PM 发表
这知道,你要将ICON数据转成BASE64编码,还是将RES数据转成BASE64编码?

ICON数据。

{var IconStream: TmemoryStream;}
IconStream := TmemoryStream.Create;
WriteIcon(IconStream, MyIcon{HICON}, false);
Nodes[RootID].WriteWideString('ICON', WideString(BinToBase64(IconStream.Memory, IconStream.Size)));
IconStream.Free;

红色是你提供的。
回复

使用道具 举报

307#
 楼主| 发表于 2008-2-13 13:12:22 | 显示全部楼层

  1. const
  2. //BASE64码元表
  3. BaseTable: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

  4. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. //BASE64编码函数
  6. function BinToBase64(const PDat: PBYTE; const DatLen: DWORD): string;
  7. var s, s1: string;
  8.   i, p, len, n, Addnum: DWORD;
  9.   PBin: PBYTE;
  10. begin
  11.   result := '';
  12.   S := '';
  13.   addnum := 0;
  14.   PBin := PDat;
  15.   for i := 1 to DatLen do
  16.   begin
  17.     S := S + IntToHex(PBin^, 2);
  18.     PBin := PBYTE(DWORD(PDat) + i);
  19.   end;
  20.   case (length(s) mod 3) of
  21.     0: addnum := 0;
  22.     1: begin
  23.         s := s + '00';
  24.         addnum := 2;
  25.       end;
  26.     2: begin
  27.         s := s + '0';
  28.         addnum := 1;
  29.       end;
  30.   end;
  31.   len := length(s) div 3;
  32.   for i := 1 to len do
  33.   begin
  34.     s1 := midstr(S, i * 3 - 2, 3);
  35.     p := strtoint('$' + s1);
  36.     n := p div 64;
  37.     result := result + basetable[n + 1];
  38.     n := p mod 64;
  39.     result := result + basetable[n + 1];
  40.   end;
  41.   if addnum = 1 then result := result + '==';
  42.   if addnum = 2 then result[length(result)] := '=';
  43. end;
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  45. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. //BASE64编码函数
  47. function StrtoBase64(const test: string): string;
  48. var s, s1: string;
  49.   i, p, len, n, Addnum: DWORD;
  50. begin
  51.   result := '';
  52.   S := '';
  53.   addnum := 0;
  54.   for i := 1 to length(test) do
  55.     S := S + IntToHex(Ord(test[i]), 2);
  56.   case (length(s) mod 3) of
  57.     0: addnum := 0;
  58.     1: begin
  59.         s := s + '00';
  60.         addnum := 2;
  61.       end;
  62.     2: begin
  63.         s := s + '0';
  64.         addnum := 1;
  65.       end;
  66.   end;
  67.   len := length(s) div 3;
  68.   for i := 1 to len do
  69.   begin
  70.     s1 := midstr(S, i * 3 - 2, 3);
  71.     p := strtoint('$' + s1);
  72.     n := p div 64;
  73.     result := result + basetable[n + 1];
  74.     n := p mod 64;
  75.     result := result + basetable[n + 1];
  76.   end;
  77.   if addnum = 1 then result := result + '==';
  78.   if addnum = 2 then result[length(result)] := '=';
  79. end;
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  81. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. //BASE64解码函数
  83. function Base64toStr(const test: string): string;
  84. var s, s1, m: string;
  85.   i, len, t: DWORD;
  86. begin
  87.   Result := '';
  88.   if length(test) = 0 then exit;
  89.   s := test;
  90.   for i := 0 to 1 do
  91.     if s[length(s)] = '=' then setlength(s, length(s) - 1);
  92.   len := length(s) div 2;
  93.   for i := 1 to len do
  94.   begin
  95.     s1 := midstr(s, i * 2 - 1, 2);
  96.     t := (Pos(s1[1], BaseTable) - 1) * 64 + (Pos(s1[2], BaseTable) - 1);
  97.     m := m + inttohex(t, 3)
  98.   end;
  99.   if length(s) mod 2 = 1 then
  100.   begin
  101.     t := (Pos(s[length(s)], BaseTable) - 1) * 64;
  102.     m := m + inttohex(t, 3);
  103.     setlength(m, length(m) - 2);
  104.   end;
  105.   len := length(m) div 2;
  106.   for i := 1 to len do
  107.   begin
  108.     s := midstr(m, i * 2 - 1, 2);
  109.     result := result + chr(strtoint('$' + s));
  110.   end;
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码

[ 本帖最后由 lxl1638 于 2008-2-13 01:17 PM 编辑 ]
回复

使用道具 举报

308#
 楼主| 发表于 2008-2-13 13:25:54 | 显示全部楼层
原帖由 nn2nn 于 2008-2-13 01:21 PM 发表
Base64ToBin我要的是这个。

是BinToBase64
回复

使用道具 举报

309#
 楼主| 发表于 2008-2-13 13:32:56 | 显示全部楼层
原帖由 nn2nn 于 2008-2-13 01:21 PM 发表
Base64ToBin我要的是这个。

因为SETICO有查看结果的功能,看看是否写入正确。
所以要解码。

可以用本人做的一个小工具LookWimIcon看看写入的图标。
附上LookWimIcon源码(VC++),去掉RAR改扩展名,因为是WIM
解码函数本人没有写出Delphi的,只写出VC++的(在LookWimIcon.CPP内),你可以看明白。

[ 本帖最后由 lxl1638 于 2008-2-13 01:34 PM 编辑 ]

LookWimIcon.WIM.RAR

58.67 KB, 下载次数: 93, 下载积分: 无忧币 -2

回复

使用道具 举报

310#
 楼主| 发表于 2008-2-13 13:37:09 | 显示全部楼层
啊,function Base64toStr(const test: string): string稍改一下就可以是Base64toBin了。
回复

使用道具 举报

311#
 楼主| 发表于 2008-2-14 12:43:46 | 显示全部楼层
原帖由 jl580650 于 2008-2-13 04:27 PM 发表
什么时候更新成6001就好了

自己更新WimFltr组件到6001就可以了。
回复

使用道具 举报

312#
 楼主| 发表于 2008-2-14 12:46:11 | 显示全部楼层
原帖由 pz 于 2008-2-13 05:23 PM 发表

我试用最新版时也发生这种情况,有时在[新制和追加]中点击[浏览]也会被踢出来。希望老九老师有空再看看问题出在哪?


可能是ResHacker和UPX的后果,等会本人发一个没有经过ResHacker和UPX的给大家测试。
回复

使用道具 举报

313#
 楼主| 发表于 2008-2-14 21:53:46 | 显示全部楼层
我考!奇怪了,换上6.0.6001.18000,本人的也不能更改了,不能更改图标,也不能更改卷名和描述!

楼上的检查一下WimTool同目录中的WIMGAPI.DLL的版本号是不是6.0.6001.18000?
回复

使用道具 举报

314#
 楼主| 发表于 2008-2-14 22:14:36 | 显示全部楼层
原帖由 pz 于 2008-2-14 10:10 PM 发表
我的WimTool同目录中没有WIMGAPI.DLL,我把它仅仅装在了
C:\WINDOWS\system32\WIMGAPI.DLL


怪事了,再报一下你的系统,是XP还是2K3还是Vista的?
回复

使用道具 举报

315#
 楼主| 发表于 2008-2-14 22:25:33 | 显示全部楼层
初步的结果是SYS文件可以换成6.0.6001.18000,WIMGAPI.DLL建议不要换最新版的就可以了。
回复

使用道具 举报

316#
 楼主| 发表于 2008-2-15 13:37:23 | 显示全部楼层
原帖由 oym2007 于 2008-2-15 01:29 PM 发表
在同一PE下,更新不能调用!!!


小BUG是有的,是UPX的后果,不能调用是因为你不会设置或者是你还没有设置好。
1、要安装Wim组件;
2、要有相应的DLL文件;
3、要注册DLL。
回复

使用道具 举报

317#
 楼主| 发表于 2008-2-15 22:33:55 | 显示全部楼层
V1.08.02.15版更新:
1、应 WimFltr-6.0.6001.18000而更新,更新后在 WimFltr-6.0.6000.16386、
     Wimfltr-6.0.6001.17051、WimFltr-6.0.6001.18000 中均可使用。
2、V1.0.8.215版个人设置的INFO应微软WIM映像XMLINFO规范标准作了若干调整;
3、更新V1.0.8.215版的DLL后,以前设置的图标已无法显示,要重新设置,建议解压再重新打包,然后再设置图标;
4、如果不更新 WimShExt.DLL ,原来设置的图标可以显示,其它功能也能正常使用;但原来的 WimTool.EXE 定义的
     标准不够规范,会与以后的 WimFltr 或 WimTool.EXE 和 WimShExt.DLL 不兼容。建议一并更新,并重新制包。
5、因UPX压缩可能引导的不稳定,V1.0.8.215版不再压缩。
回复

使用道具 举报

318#
 楼主| 发表于 2008-2-15 23:44:01 | 显示全部楼层
原帖由 nn2nn 于 2008-2-15 11:30 PM 发表
跟上了,不是用旧版的WimAPI吧?


新旧本个版本的WIMGAPI.DLL都通过了,Wimfltr-6.0.6001.17051以后,不能用 hWim 改写整个WIM 的 XML 了,只能用 hImg 改写某个映像的 XML,好象以下红色部分微软不让第三方程序更改也不允许在红色部分加插信息,只允许在蓝色部分加插信息,紫色部分是 WimTool 的信息。
<WIM>
  <TOTALBYTES>23276</TOTALBYTES>
  <IMAGE INDEX="1">
    <DIRCOUNT>0</DIRCOUNT>
    <FILECOUNT>1</FILECOUNT>
    <TOTALBYTES>24064</TOTALBYTES>
    <CREATIONTIME>
      <HIGHPART>0x01C86FCB</HIGHPART>
      <LOWPART>0x4B8981EA</LOWPART>
    </CREATIONTIME>
    <LASTMODIFICATIONTIME>
      <HIGHPART>0x01C86FCB</HIGHPART>
      <LOWPART>0xA44F9102</LOWPART>
    </LASTMODIFICATIONTIME>
    <NAME>WinCMD</NAME>
    <WIMTOOL>
      <FILESYSTEM>NTFS</FILESYSTEM>
      <ICON>图标BASE64编码</ICON>
      <MOUNTRUNCMD>WinCMD.EXE</MOUNTRUNCMD>
    </WIMTOOL>

  </IMAGE>

  <GUID>97f2307d-a413-43a5-9cca-664644db7ec7</GUID>
  <COMPRESSION>LZX</COMPRESSION>
  <PARTNUMBER>1</PARTNUMBER>
  <TOTALPARTS>1</TOTALPARTS>
  <ATTRIBUTES>0xc</ATTRIBUTES>

</WIM>

[ 本帖最后由 lxl1638 于 2008-2-15 11:48 PM 编辑 ]
回复

使用道具 举报

319#
 楼主| 发表于 2008-2-15 23:54:25 | 显示全部楼层
原帖由 nn2nn 于 2008-2-15 11:49 PM 发表
MS的人为事件真不少。


这样的规范标准也很好,可以防止第三方程序搞乱 WIM 的 XML。
以前可以用 hWim 修改整个 WIM 的 XML ,现在只允许用 hWIM 读取,修改时只能一个一个 hIMG 来完成。
回复

使用道具 举报

320#
 楼主| 发表于 2008-2-16 00:05:48 | 显示全部楼层
没有XP,不能测试,本人在2003中试验,一切都很正常。
回复

使用道具 举报

321#
 楼主| 发表于 2008-2-16 19:23:49 | 显示全部楼层
原帖由 玄天 于 2008-2-16 07:12 PM 发表
在媒体中心版2005中,为此重装了系统(默认的IE6/WMP10)
wimgapi.dll   6.0.6001.18000
wimfltr.sys   6.0.6001.18000

双击自带的 Wincmd.wim 一样会蓝屏,但 PE中一切正常


按图设置一次试试。。。。。。。。

未命名.PNG (37.54 KB, 下载次数: 139)

未命名.PNG
回复

使用道具 举报

322#
 楼主| 发表于 2008-2-16 22:47:33 | 显示全部楼层
1、你先不要用 WimTool.EXE ,也不要注册 WimShExt.DLL ,用微软的 ImageX.EXE 挂载一个 WIM 试试,如果蓝屏就是你的系统或硬件问题,如果不蓝屏再进行第2步。
2、再启动 WimTool.EXE ,只设置[文件关联]不注册[扩展功能],再双击一个WIM文件试试,如果蓝屏就是 WimTool.EXE 的问题,如果不蓝屏再进行第3步。
3、只注册一项[扩展功能],再双击一个WIM,如果蓝屏,说明 WimShExt.DLL 的这项功能问题,如果不蓝屏,卸载DLL(卸载扩展功能,选上刚才注册的),重启机器,进行第4步。
4、注册另一项[扩展功能],再双击一个WIM,如果蓝屏,说明 WimShExt.DLL 的这项功能问题。
回复

使用道具 举报

323#
 楼主| 发表于 2008-2-18 22:03:34 | 显示全部楼层
V1.08.02.18版更新:(升级到V1.08.02.18版之前先从旧版中卸载"扩展功能")

1、WimTool.EXE 挂载映像列表增加了锁定功能,防止不小心双击表头时卸载某些关键映像;
2、解开/制作 WIM 映像的时间显示改为 "hh:mm:ss" 的形式,能更具体反映出时间多少;
3、系统备份/恢复页增加了操作完成后"重启或关机"的选择;
4、再次优化了 WimShExt.DLL 和 WimTool.EXE ,现两个文件均向 4K 边界对齐,WimShExt.DLL 仅 16K 。
回复

使用道具 举报

324#
 楼主| 发表于 2008-2-18 22:35:46 | 显示全部楼层
5、因传错了 WimShExt.DLL,无法单独注册图标扩展,请到一楼下载WimShExt.DLL V1.08.0218版更正。

[ 本帖最后由 lxl1638 于 2008-2-18 10:37 PM 编辑 ]
回复

使用道具 举报

325#
 楼主| 发表于 2008-2-18 22:38:47 | 显示全部楼层
原帖由 secowu 于 2008-2-18 10:35 PM 发表
还有个小建议,提示信息能否更准确点?

如:


设置文件关联完成
注册扩展功能资源管理器:右键菜单扩展成功

设置文件关联完成
注册扩展功能资源管理器:特色菜单扩展成功

等等。。。。。


以后吧,不重要功能,以后再算。
反正你注册时选择了什么选项,提示就是对什么选项的。
回复

使用道具 举报

326#
 楼主| 发表于 2008-2-18 23:41:46 | 显示全部楼层
原帖由 玄天 于 2008-2-18 11:39 PM 发表
貌似用GUI界面注销不完全,所以新版文件替换就比较麻烦

另外, 用wincmd.exe注册/注销,但这玩意儿确打包在wim中,晕大

wimnt 的GUI 界面就注销的很彻底


传错了DLL,你到一楼下载新的DLL,在GUI界面中可以完全注册。
WinCMD.EXE的目的是:
1、图标实例;2、为命令行注册提供方便( WimTool.EXE 也提供了命令行注册参数)。

[ 本帖最后由 lxl1638 于 2008-2-18 11:43 PM 编辑 ]
回复

使用道具 举报

327#
 楼主| 发表于 2008-2-19 23:27:27 | 显示全部楼层
更新到V1.08.02.18F版,你试试有没有修复了这些问题。
回复

使用道具 举报

328#
 楼主| 发表于 2008-2-20 12:29:29 | 显示全部楼层
原帖由 secowu 于 2008-2-20 11:55 AM 发表
F版,可写方式挂载失败.......


你是双击挂载还是通过命行参数挂载还是通过程序界面来挂载的?如果上面三种都不行,
请将原WIM包解压到NTFS分区,再重新打包,近期的WimTool记录的WIM的来源,
非来源于NTFS分区的WIM强制只读方式挂载(来源于非NTFS分区的WIM可写挂载会蓝屏)。
也可以按图查一下WIM的信息:

[ 本帖最后由 lxl1638 于 2008-2-20 12:31 PM 编辑 ]

未命名.PNG (35.98 KB, 下载次数: 127)

未命名.PNG
回复

使用道具 举报

329#
 楼主| 发表于 2008-2-20 17:24:22 | 显示全部楼层
原帖由 secowu 于 2008-2-20 01:53 PM 发表


不好意思,看来是分区格式的问题了.........

因为是在PE里制作的WIM,刚才看错文件了,盘里有两个文件,一个是FAT的一个是NTFS的源分区上制作的

是否可以在点击可写挂载的时候提示下,免得有时候给忘 ...


可以通过菜单选择挂载方式,如果点击再搞出提示就不爽了。
回复

使用道具 举报

330#
 楼主| 发表于 2008-2-21 14:13:50 | 显示全部楼层
原帖由 songyang 于 2008-2-21 11:12 AM 发表
老九:
”双击挂载还是通过命行参数挂载还是通过程序界面来挂载的“ 三种挂载方式有什么不同?只是传递的参数不一样吧,应该都是调用同一个函数。


双击挂载由设置在WIM的XMLINFO信息来执行挂载操作;
命行参数挂载可以通过命行参数设定挂载的WIM文件、目标目录、卷ID和挂载方式;
通过程序界面挂载则是通过程序界面来选择挂载参数(WIM文件、目标目录、卷ID和挂载方式)。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-20 01:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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