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

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

   火... [复制链接]
 楼主| 发表于 2013-3-31 00:04:23 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-30 23:48 发表
PUTF -dd 可以搞到 ud 区的文件?那 GETF 应该也能直接从 ud 读文件到内存吧?

是否这样:
比如 ud 区对应的磁盘用 fbinst --list 看到的序号是 (hd1),fbinst (hd1) info 输出的目录项:
  1e   "MINIPE/ ...


是的。 前提是 文件存在 UD扩展区,这样才是连续存放; 否则不连续,读写很复杂。
需要注意编码(UTF8、UNICODE。。。)

有个好处, 可以带参数。可以完全掌控。 不像 FBINST ,死死的。 一个黑窗口都弄半天。

我写的 那个MBROS(裸机系统) 基本也是这种方式, 来运行的。 不过加了共享机制, 多个运行,只拷贝一份。

[ 本帖最后由 mdyblog 于 2013-3-31 00:10 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-3-31 00:20:01 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-30 23:48 发表
PUTF -dd 可以搞到 ud 区的文件?那 GETF 应该也能直接从 ud 读文件到内存吧?

是否这样:
比如 ud 区对应的磁盘用 fbinst --list 看到的序号是 (hd1),fbinst (hd1) info 输出的目录项:
  1e   "MINIPE/ ...


前面的问题是不是 FBINST 不支持 异步 执行的原因。
所有FBINST命令  加一个进程同步锁(如#pecmd)试试, 这样同一时间点, 就只有一个FBINST 命令执行。
{ LOCK #pecmd      //同步锁
  EXEC*  .... =!FBINST 。。。。
}   //这里自动解锁
回复

使用道具 举报

 楼主| 发表于 2013-3-31 00:57:46 | 显示全部楼层

启动内存盘IE.wcs.zip

启动内存盘IE.wcs.zip
启动IE前, 创建一个和100M内存盘, IE缓存设到里面。

IE 退出时, 自动删除 内存盘, 释放内存。
回复

使用道具 举报

发表于 2013-3-31 00:58:07 | 显示全部楼层
不清楚,FBINST 导出和 LOAD 的命令都是同一个线程,全都在主线程就 OK,THREAD 不管从哪里分貌似都会出问题。

其实我现在更倾向于走内存这边,现在是想方设法减少启动所需时间,磁盘操作能绕就绕了,直接走内存还省了写盘浪费的时间,虽然那一个ini内容不多,但是万一碰到切片怎么的卡一下十几秒就进去了,之前的测试遇到过好几回了。
回复

使用道具 举报

发表于 2013-3-31 01:03:24 | 显示全部楼层
GETF \\.\PhysicalDrive1,0x9055S#282,&&TEXT

这个读出来MESS是一串 0xXX 0xXX,GETF# 的话MESS是一堆乱码因为是二进制数据,用 WinHex 查看结果是对的。
这种应该怎么转换为 PECMD 可以处理的字串?还是说,用 LOAD **mem 就能直接加载了?

[ 本帖最后由 2010qaqz111 于 2013-3-31 01:17 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-3-31 01:18:59 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 01:03 发表
GETF \\.\PhysicalDrive1,0x9055S#282,&&TEXT

这个读出来MESS是一串 0xXX 0xXX,GETF# 的话MESS是一堆乱码因为是二进制数据,用 WinHex 查看结果是对的。
这种应该怎么转换为 PECMD 可以处理的字串?还是说 ...

GETF  的结果为HEX 形式。
需要转换。
PUTF -dd  方便些。
回复

使用道具 举报

发表于 2013-3-31 01:29:11 | 显示全部楼层
PUTF 的说明太少,有些不明白,不过这貌似应该是写文件的?能直接写到 PE 变量么?

[ 本帖最后由 2010qaqz111 于 2013-3-31 01:35 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-3-31 01:34:03 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 01:03 发表
GETF \\.\PhysicalDrive1,0x9055S#282,&&TEXT

这个读出来MESS是一串 0xXX 0xXX,GETF# 的话MESS是一堆乱码因为是二进制数据,用 WinHex 查看结果是对的。
这种应该怎么转换为 PECMD 可以处理的字串?还是说 ...


SET#$  转换为2进制:

SET#$   &&binData=%&TEXT%
LOAD **mem  &binData    //假设为UNICODE编码
回复

使用道具 举报

发表于 2013-3-31 01:36:16 | 显示全部楼层
CODE **-ANSI,&TEXT,**-,&&A1
LOAD **mem &A1
这样倒是可以,不过 LOAD 可以直接加载 ANSI 的二进制块吗?
磁盘文件都可以直接加载 ANSI 编码或者根据BOM自行判断,那 **mem 加载应该也可以啊?

[ 本帖最后由 2010qaqz111 于 2013-3-31 01:39 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-3-31 01:49:27 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 01:36 发表
CODE **-ANSI,&TEXT,**-,&&A1
LOAD **mem &A1
这样倒是可以,不过 LOAD 可以直接加载 ANSI 的二进制块吗?
磁盘文件都可以直接加载 ANSI 编码或者根据BOM自行判断,那 **mem 加载应该也可以啊?


我改改, 自动判断。

PECMD2012.1.75.1-130314-23.多窗口线程孵化版_win32_64.sfx
直接:
GETF#   \\.\PhysicalDrive1,0x9055S#282,&&binData
LOAD **mem  &binData  aa bb 尺寸 多点 谔谔

[ 本帖最后由 mdyblog 于 2013-3-31 02:32 编辑 ]
回复

使用道具 举报

发表于 2013-3-31 01:51:44 | 显示全部楼层
SET-tow &A1=&TEXT
这样也可以完成 CODE **-ANSI,&TEXT,**-,&&A1 的转换,TEXT的内容是 GETF# 读取的。
回复

使用道具 举报

发表于 2013-3-31 02:18:19 | 显示全部楼层
原帖由 <i>mdyblog</i> 于 2013-3-31 01:49 发表
PECMD2012.1.75.1-130314-23.多窗口线程孵化版_win32_64.sfx
直接:
GETF \\.\PhysicalDrive1,0x9055S#282,&&binData
LOAD **mem  &binData  aa bb 尺寸 多点 谔谔


这样就很方便了,ud 出来的文本文件基本上全都可以走内存了。
回复

使用道具 举报

发表于 2013-3-31 04:32:02 | 显示全部楼层
GETF 和 PUTF 支持 (hd0) 这样的设备名吗?
回复

使用道具 举报

发表于 2013-3-31 08:27:54 | 显示全部楼层
请问大师

   如何将有驱动加载并需要重新启动机器的软件安装到WinPE中, 比如说像防火墙之类或Process Guard之类的软件如何安装到WinPE中。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 08:29:13 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 04:32 发表
GETF 和 PUTF 支持 (hd0) 这样的设备名吗?

不支持。
\\.\PhysicalDrive0    ----  (hd0)
\\.\PhysicalDrive1    ----  (hd1)
回复

使用道具 举报

 楼主| 发表于 2013-3-31 08:37:16 | 显示全部楼层
原帖由 clonecd 于 2013-3-31 07:59 发表
搭车问一下,如果我要导出的不是脚本文件,而是一个2到3MB的东西,用PUTF -dd怎么导出,就举前面讲过的例子。PUTF -dd类似linux里的,不过看得不是很明白。给个例子吧。
比如 ud 区对应的磁盘用 fbinst --list 看到的序号是 (hd1),fbinst (hd1) info 输出的目录项:
1e "MINIPE/BOOT.INI" 0x9055 282 (2013-03-23 12:29:35)





PUTF -dd -bs=10M   -len=282  -skipb=0x9055S  -quick    D:\boot.ini,0,\\.\PhysicalDrive1

// -bs=10M  为10M高速缓冲;
// -len=282  为文件长度;   
// -skipb=0x9055S 为输入数据在磁盘上的位置
回复

使用道具 举报

 楼主| 发表于 2013-3-31 08:41:51 | 显示全部楼层
原帖由 gggaoshan 于 2013-3-31 08:27 发表
请问大师

   如何将有驱动加载并需要重新启动机器的软件安装到WinPE中, 比如说像防火墙之类或Process Guard之类的软件如何安装到WinPE中。



这个慢慢调试了。
先手动安装一次。
不重启, 将文件部署 和注册表部署信息记录下来。
在PE启动前, 恢复这些部署。恢复的时机越早,越可靠。
再调调。

[ 本帖最后由 mdyblog 于 2013-3-31 09:09 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2013-3-31 09:01:23 | 显示全部楼层
更正: --clone:方式 应该如下,不加占位参数。 后面直接为脚本参数。

SET &Cmd=MESS 【%%*】 @ #OK //脚本存入PE变量&cmd中,支持多行

//还可以这样 多进程方式
EXEC --clone:&Cmd --exe:"%MyName%" 1 2 3 4 5 6 //--clone:方式 执行, 可以带参数。 这是多进程方式
//结果【1 2 3 4 5】

回复

使用道具 举报

 楼主| 发表于 2013-3-31 09:30:31 | 显示全部楼层
PECMD2012.1.75.1-130314-24.多窗口线程孵化版_win32_64.sfx.zip
THREAD$  
$后缀: 创建线程前,提前解释一次。
这样可以用%* %@ %1 %2  。。。
还可以减少 THREAD* 犯一种错误的可能性: 变量异步冲突 的逻辑错误。
注意, 线程运行时还要解释的一次。


变量异步冲突 示例:
TEAM ENVI &&&FORCELOCAL=1| ENVI &&&EnviMode=1
_SUB WIN1, W100H100
  SET &I=1
  LOOP %I%<5,
  {
     SET &J=%I%
     THREAD*   MESS I=%&I%  J=%J%
     CALC I=%I% + 1
  }
_END

会发现 I J 的值可能不同。有时同,有时不同, 随机的。换成[THREAD* TEAM WAIT 100|MESS I=%&I% J=%J%]则一定不同。
这就是 变量异步冲突 的逻辑错误。
I 时共享变量,  子线程和父线程 共享。(在持久栈,如窗口,上定义的PE变量均为共享变量)
子线程解释I时, 父线程 已经修改了该值, 逻辑错误。
J是局部变量, 子线程会自动复制自己的一份。 不冲突。

解决1(标准方法):
用局部变量传递
{
SET &J=%I%
SET &I2=%I%
THREAD* MESS I=%&I2% J=%J%
CALC I=%I% + 1
}


解决2(简洁方法):
用THREAD$
{
SET &J=%I%
THREAD*$  MESS I=%&I% J=%J%
CALC I=%I% + 1
}

此时提前解释了, 对线程了说,%I% 已换成了 实际值.
可能等价:
THREAD*$ MESS I=1 J=1


THREAD不带*时, 共享变量不共享, 也会拷贝, 没问题。 但全局变量还是共享的。

[ 本帖最后由 mdyblog 于 2013-3-31 10:09 编辑 ]
回复

使用道具 举报

发表于 2013-3-31 09:45:35 | 显示全部楼层
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUNC1 的地方就是这样的日志:
[FUNC1 V1 V2 V3]:<2> 系统找不到指定的文件。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 10:00:47 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 09:45 发表
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUN ...

这个文件 不在UD扩展区的原因, 此时文件不连续。 中间不时冒出个垃圾字符,是UD加的控制字符。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 10:04:07 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 09:45 发表
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUN ...

用FBINST 将文件移到扩展区吧。
或:

这样的还是用 Fbinst load 吧。

你改改逻辑。
UPLOAD 文件 改在子线程中。

_SUB ThreadUpLoadLoad
  // FBINST UPload to D:\AA.INI
  LOAD  D:\AA.INI  AAA BB CC
_END

或FBINST CAT
_SUB ThreadUpLoadLoad
  // FBINST CAT  to  &&binData  
  LOAD **mem  &binData   AAA BB CC
_END

[ 本帖最后由 mdyblog 于 2013-3-31 10:17 编辑 ]
回复

使用道具 举报

发表于 2013-3-31 10:08:04 | 显示全部楼层
是不在扩展区的原因?
我比对了源文件发现这个问号大概是每512字节出现一次,我移到扩展区试试。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 10:10:22 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 10:08 发表
是不在扩展区的原因?
我比对了源文件发现这个问号大概是每512字节出现一次,我移到扩展区试试。

对头                       
回复

使用道具 举报

发表于 2013-3-31 10:24:50 | 显示全部楼层
移到扩展区没问题了。不过不明白为毛弄个主区和扩展区的区别出来?主区那个控制字节又是啥?


IMPORT 的防止重入是否在第二次IMPORT同一个文件的时候就会在LOG里返回 <2>系统找不到指定文件?
回复

使用道具 举报

 楼主| 发表于 2013-3-31 10:42:44 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 10:24 发表
移到扩展区没问题了。不过不明白为毛弄个主区和扩展区的区别出来?主区那个控制字节又是啥?


IMPORT 的防止重入是否在第二次IMPORT同一个文件的时候就会在LOG里返回 系统找不到指定文件?

可能是早期版本,用这个吧。 后来这种格式还留下来了。 现在FBINT应该默认都放到扩展区,修改时不改变在那个区。
分成2种区, 为了区分启动信息和数据。 启动信息文件一般放到前面主区,一般不变了,这样保护启动信息。UD的菜单只能在主区,移不出来。
  
主区那个控制字节 是链接信息。 一块一块的链接起来,组成一个文件。

IMPORT 的确有 “防止重入”功能。
不返回任何信息。 直接丢弃。因为不在 执行时处理的。
回复

使用道具 举报

发表于 2013-3-31 10:46:37 | 显示全部楼层
现在遇到这样的情况:

文件 L1 定义了2个_SUB

文件 A IMPORT 了 L1,可以调用 L1 定义的 _SUB
文件 A LOAD 文件 B,文件 B 需要用 L1 定义的 _SUB,但是它不能继承 A IMPORT 来的内容
文件 B 自己 IMPORT L1,调用 L1 定义的 _SUB,LOG返回 <2>系统找不到指定的文件

这种情况应该怎么办?
回复

使用道具 举报

 楼主| 发表于 2013-3-31 11:04:00 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 10:46 发表
现在遇到这样的情况:

文件 L1 定义了2个_SUB

文件 A IMPORT 了 L1,可以调用 L1 定义的 _SUB
文件 A LOAD 文件 B,文件 B 需要用 L1 定义的 _SUB,但是它不能继承 A IMPORT 来的内容
文件 B 自己 IMPO ...


文件 B 自己 IMPORT L1】这样可以的。 是不是 不在一个目录啊。 这样需要全路径。
附件输出:
F  from D:\MDY\DESKTOP\Test\IMP\A.WCS
F  from D:\MDY\DESKTOP\Test\IMP\B.WCS

分别别是 A.WCS 中的L1.WCS  B.WCS中的L1.WCS运行的结果。
%CurFile% 为IMPORT 他的文件。

IMPORT 不跨 LOAD。

  1. [LOGS * X.LOG] <0>:操作成功完成。
  2. [MESS F  from D:\MDY\DESKTOP\Test\IMP\A.WCS] <0>:操作成功完成。
  3. [F] <0>:操作成功完成。
  4. [MESS F  from D:\MDY\DESKTOP\Test\IMP\B.WCS] <0>:操作成功完成。
  5. [F] <0>:操作成功完成。
  6. [LOAD B.WCS] <0>:操作成功完成。
  7. [LOGS ] <0>:操作成功完成。
复制代码


[ 本帖最后由 mdyblog 于 2013-3-31 11:20 编辑 ]

IMP.wcs.zip

620 Bytes, 下载次数: 7

回复

使用道具 举报

发表于 2013-3-31 17:48:21 | 显示全部楼层
是带的全路径,Import 的路径支持变量解释么?比如这样:

SET &WS=%windir%\system32
IMPORT %&WD%\L1.wcs
回复

使用道具 举报

发表于 2013-3-31 18:08:56 | 显示全部楼层
IMPORT 是运行前执行,不支持 PE 变量解释路径,而且因为是运行前执行,被 IMPORT 的文件还没有 FILE=> 到位,难怪找到的文件版本不对,囧。

看来得另外想办法了。


如果 L1 仅仅定义了 _SUB 和一些文件级的 SET &,在 A 里面用 LOAD 加载 L1 完成之后也不能调用 L1 里面的 _SUB,这麻烦了。

[ 本帖最后由 2010qaqz111 于 2013-3-31 18:15 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-10 18:38

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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