无忧启动论坛

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

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

    [复制链接]
5041#
发表于 2013-3-30 18:30:21 | 只看该作者
原帖由 mdyblog 于 2013-3-30 17:11 发表
PECMD2012.1.75.1-130314-21.多窗口线程孵化版_win32_64.sfx
FIND  VK_ 可省


[FIND KEY=LCONTROL,TEAM MESS LCONTROL| EXIT LOOP] :操作成功完成。
[FIND KEY=RCONTROL,TEAM MESS RCONTROL| EXIT LOOP]  ...


IFEX 也可以用来检测按键吗?我看到 IFEX 和 FIND 的说明里都有 KEY= 的用法。
回复

使用道具 举报

5042#
 楼主| 发表于 2013-3-30 19:19:28 | 只看该作者
原帖由 2010qaqz111 于 2013-3-30 18:30 发表


IFEX 也可以用来检测按键吗?我看到 IFEX 和 FIND 的说明里都有 KEY= 的用法。

可以。 实际是一样的。
内部IFEX  FIND  是一个函数。 很多一样或类似。
回复

使用道具 举报

5043#
 楼主| 发表于 2013-3-30 19:22:15 | 只看该作者
原帖由 2010qaqz111 于 2013-3-30 18:27 发表
THREAD LOAD 好像是文件访问的问题,可惜 LOGS 的信息不够详细,我再试试。

写成函数

_SUB ThreadLoad
   @SET &cmd=THREAD*   LOAD  %*
   %&cmd%
_END

ThreadLoad "ABC.INI"  aa bb cc
回复

使用道具 举报

5044#
 楼主| 发表于 2013-3-30 20:04:07 | 只看该作者

LOOP 支持单操作数

LOOP 支持单操作数, 比较符和第二参数可省。
循环条件: 格式为  [$|#]变量1[<比较符>变量2]


1: LOOP #整数, 命令
2: LOOP 浮点数, 命令
  非0即为真
如 LOOP #1,  wait 100  //真
   LOOP  1,  wait 100  //真
如 LOOP #-1, wait 100  //真
   LOOP  -1, wait 100  //真
如 LOOP #0,  wait 100  //假

   LOOP  0,  wait 100  //假

3: LOOP $字串, 命令
字串非空即为真
LOOP $A, wait 100   //真
LOOP $,  wait 100   //假

[ 本帖最后由 mdyblog 于 2013-3-30 20:06 编辑 ]
回复

使用道具 举报

5045#
发表于 2013-3-30 20:59:25 | 只看该作者
THREAD* LOAD 之前加了 LOOP IFEX 等待文件也有问题,时行时不行的,肯定是多线程同步上的问题,但是又不知道是什么原因。

LOOP 的条件能够像 IFEX 一样判断文件存在吗?这样等待文件的循环写起来就能简洁一点了。
回复

使用道具 举报

5046#
 楼主| 发表于 2013-3-30 21:09:06 | 只看该作者

回复 #5382 2010qaqz111 的帖子

算了吧。 这种用法 太罕见了。

你建的文件 在 %SystemRoot%\System32\下吗? 系统是64位的吗?
64位 的话, 还是用 64位PECMD试试。



LOAD 前等一下, 可能文件内容还没完成, 此时文件为空,或不全。
_SUB  ThreadCheckLoad
    SET &cmd=THREAD* CALL  ThreadCheckLoadReal %*
    %&cmd%
_END

_SUB ThreadCheckLoadReal   //线程中等待
    SET &file=%~1
    SET &cmd=LOAD %*
    LOOP 1,
    {
        IFEX %&file%, EXIT LOOP

        WAIT 100
    }
    WAIT 500 //等等
    WAIT 500 //等等, 自己调调
    //WAIT 500 //等等, 自己调调
    %&cmd%

_END

ThreadCheckLoad  "D:\upload\aa.ini"  aa bb cc



[ 本帖最后由 mdyblog 于 2013-3-30 21:19 编辑 ]
回复

使用道具 举报

5047#
发表于 2013-3-30 21:19:38 | 只看该作者
建的文件不在 system32 下,在系统目录之外的一个普通路径,32位的 WIN8PE。

这一段代码:
LOOP #1=1,
{   IFEX DRV_VGA.INI,EXIT LOOP
    WAIT 200
}
THREAD* TEAM {LOAD DRV_VGA.INI|FILE DRV_VGA.INI}

从 LOG 的记录看,IFEX 检测到文件退出了 LOOP,LOOP 返回<0>,然后 LOAD 成功,返回<0>,但是 INI 里的内容没有被执行,再然后紧接的下一条 LOG 就是 FILE 返回<2>:找不到文件。
有可能是磁盘系统的后写缓存之类的原因,但是如果不用 THREAD 的话直接 LOAD 是一定可以的。


如果把多行命令的一个 INI 的文件内容读入一个 PE 变量,可以用 LOAD 加载运行么?
比如要新开一个线程来运行,或者直接重新启动一个 PECMD 用 LOAD 来加载运行?

用 LOAD 加载是因为想传参数,如果直接把变量名写死到 INI 里面的话,INI 的适用性就变差了。

因为 FBINST 可以用 cat 命令直接把文本文件输出到 stdout,这样可以用 EXEC* 直接放到 PE 变量里面。

[ 本帖最后由 2010qaqz111 于 2013-3-30 21:41 编辑 ]
回复

使用道具 举报

5048#
发表于 2013-3-30 22:07:51 | 只看该作者

回复 #5383 mdyblog 的帖子

CLONECD大侠的一键恢复遇到PECMD多线程难题了,
快看看
http://bbs.wuyou.net/forum.php?m ... page=100#pid2734116
回复

使用道具 举报

5049#
发表于 2013-3-30 22:43:23 | 只看该作者
这种等文件到位的方法随机性太强了不稳定,如果是 ud 区里脚本的话,我在考虑用 EXEC* 截获输出放到 PE 变量里面加载的办法,如果是磁盘文件应该也是可以的,等下有眉目了我 PO 上来。
回复

使用道具 举报

5050#
发表于 2013-3-30 22:54:53 | 只看该作者

回复 #5388 2010qaqz111 的帖子

的确,刚试用
http://bbs.wuyou.net/forum.php?m ... page=101#pid2734148
中附件,成功了一次,后来很难再现
回复

使用道具 举报

5051#
 楼主| 发表于 2013-3-30 23:20:09 | 只看该作者
原帖由 2010qaqz111 于 2013-3-30 21:19 发表
建的文件不在 system32 下,在系统目录之外的一个普通路径,32位的 WIN8PE。

这一段代码:

从 LOG 的记录看,IFEX 检测到文件退出了 LOOP,LOOP 返回,然后 LOAD 成功,返回,但是 INI 里的内容没有被执行 ...



1: 如我楼上所说, 在 LOAD 前 WAIT 1000 试试。

2》如果把多行命令的一个 INI 的文件内容读入一个 PE 变量,可以用 LOAD 加载运行么?
可以的。

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

LOAD **mem &Cmd  1 2 3 4 5     //**mem 方式运行
//结果【1 2 3 4 5】


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

//结果【1 2 3 4 5】

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

使用道具 举报

5052#
发表于 2013-3-30 23:32:38 | 只看该作者
EXEC --clone:&Cmd  --exe:"%MyName%" PECMD load dumy.ini  1 2 3 4 5 6

--exe:后面的参数在说明里说可以指定一个exe,那就是说后面 “PECMD load dumy.ini  1 2 3 4 5 6” 命令行部分的 “PECMD” 实际上只是一个占位的作用了,不管这里填什么文件名实际上加载的都是 --exe 指定的那个文件作为一个exe来加载运行,是这样吗?

--clone:变量名
这个开关说明里说是克隆一个pecmd来运行变量中的脚本,那是否后面命令行部分的前3个实际上就已经重定向为:
PECMD -> 不管写啥,实际上是又运行了一个当前进程?
load -> 不管写啥,都是给新克隆进程发送一个 LOAD 命令?
dummy.ini -> 不管写啥,都是将 LOAD 要加载的文件重定向到了 变量名 的内容?

不知道是否这样理解的。
回复

使用道具 举报

5053#
 楼主| 发表于 2013-3-30 23:32:56 | 只看该作者
原帖由 2010qaqz111 于 2013-3-30 22:43 发表
这种等文件到位的方法随机性太强了不稳定,如果是 ud 区里脚本的话,我在考虑用 EXEC* 截获输出放到 PE 变量里面加载的办法,如果是磁盘文件应该也是可以的,等下有眉目了我 PO 上来。

>> 这种等文件到位的方法随机性太强了不稳定,


可以考虑 不用 Fbinst  导出文件。
用 Fbinst  提取目录后, 再用 PUTF -dd 直接 导出文件, 这样完成时,文件一定导完毕了,就不用等了。
回复

使用道具 举报

5054#
 楼主| 发表于 2013-3-30 23:43:21 | 只看该作者
原帖由 2010qaqz111 于 2013-3-30 23:32 发表
EXEC --clone:&Cmd --exe:"%MyName%" PECMD load dumy.ini 1 2 3 4 5 6
--exe:后面的参数在说明里说可以指定一个exe,那就是说后面 “PECMD load dumy.ini 1 2 3 4 5 6” 命令行部分的 “PECMD” 实际上只是一个占位的作用了,不管这里填什么文件名实际上加载的都是 --exe 指定的那个文件作为一个exe来加载运行,是这样吗?

对的。
(1) 实际上加载的都是 --exe 指定的那个文件作为一个exe来加载运行
(2) PECMD 基本上只是占位作用。%0 就是它, 一般不用%0
      同时, 进程管理器中命令行中,最开始部分就是这个PECMD
        由于马上执行了LOAD 这个PECMD实际看不到, %0 为 dumy.ini


--clone:变量名
这个开关说明里说是克隆一个pecmd来运行变量中的脚本,那是否后面命令行部分的前3个实际上就已经重定向为:
PECMD -> 不管写啥,实际上是又运行了一个当前进程?
load -> 不管写啥,都是给新克隆进程发送一个 LOAD 命令?
dummy.ini -> 不管写啥,都是将 LOAD 要加载的文件重定向到了 变量名 的内容?

(1) 对, PECMD -> 不管写啥,实际上是又克隆了一个进程。
(2) 对, dummy.ini -> 不管写啥, LOAD 要加载的内容 为  变量的内容(不通过临时文件中介,而是完全通过内存完成)。 此时 %0就是dummy.ini .




[ 本帖最后由 mdyblog 于 2013-3-30 23:45 编辑 ]
回复

使用道具 举报

5055#
发表于 2013-3-30 23:48:53 | 只看该作者
PUTF -dd 可以搞到 ud 区的文件?那 GETF 应该也能直接从 ud 读文件到内存吧?

是否这样:
比如 ud 区对应的磁盘用 fbinst --list 看到的序号是 (hd1),fbinst (hd1) info 输出的目录项:
  1e   "MINIPE/BOOT.INI" 0x9055 282 (2013-03-23 12:29:35)

读内容到变量的命令是否这样写:
GETF \\.\PhysicalDrive1,0x9055S#282,&&TEXT
回复

使用道具 举报

5056#
 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

5057#
 楼主| 发表于 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 。。。。
}   //这里自动解锁
回复

使用道具 举报

5058#
 楼主| 发表于 2013-3-31 00:57:46 | 只看该作者

启动内存盘IE.wcs.zip

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

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

使用道具 举报

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

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

使用道具 举报

5060#
发表于 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 编辑 ]
回复

使用道具 举报

5061#
 楼主| 发表于 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  方便些。
回复

使用道具 举报

5062#
发表于 2013-3-31 01:29:11 | 只看该作者
PUTF 的说明太少,有些不明白,不过这貌似应该是写文件的?能直接写到 PE 变量么?

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

使用道具 举报

5063#
 楼主| 发表于 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编码
回复

使用道具 举报

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

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

使用道具 举报

5065#
 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

5066#
发表于 2013-3-31 01:51:44 | 只看该作者
SET-tow &A1=&TEXT
这样也可以完成 CODE **-ANSI,&TEXT,**-,&&A1 的转换,TEXT的内容是 GETF# 读取的。
回复

使用道具 举报

5067#
发表于 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 出来的文本文件基本上全都可以走内存了。
回复

使用道具 举报

5068#
发表于 2013-3-31 04:32:02 | 只看该作者
GETF 和 PUTF 支持 (hd0) 这样的设备名吗?
回复

使用道具 举报

5069#
发表于 2013-3-31 08:27:54 | 只看该作者
请问大师

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

使用道具 举报

5070#
 楼主| 发表于 2013-3-31 08:29:13 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 04:32 发表
GETF 和 PUTF 支持 (hd0) 这样的设备名吗?

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-7-27 16:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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