无忧启动论坛

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

[讨论] Edgeless插件加载器怎么写

[复制链接]
跳转到指定楼层
1#
发表于 2023-11-2 12:06:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
来自 5#
 楼主| 发表于 2025-1-22 14:40:20 | 只看该作者
本帖最后由 hdxzd 于 2025-1-22 16:06 编辑

友情提示:需要准备7z.exe,7z.dll和pecmd

.版本 2

.程序集 程序集1

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 a, 文本型, , "0"

取命令行 (a)
创建目录EX (“X:\Program Files\Edgeless\安装程序”)
.如果真 (取数组成员数 (a) = 1)
    子程序1 (a [1])
    结束 ()
.如果真结束
标准输出 (, “输入Edgeless插件包所在文件夹或文件:”)
子程序1 (标准输入 ())
结束 ()
返回 (0)  ' 可以根据您的需要返回任意数值

.子程序 子程序1
.参数 文件路径, 文本型
.局部变量 文件名, 文本型, , "0"
.局部变量 a, 整数型

.如果 (文件_是否为目录 (文件路径))
    改变目录 (“X:\Program Files\Edgeless\”)
    文件_枚举 (文件路径, “*.7z”, 文件名, 真, )
    .计次循环首 (取数组成员数 (文件名), a)
        运行 (“7z x ” + #引号 + 文件路径 + #引号 + “ ” + #引号 + “-oX:\Program Files\Edgeless\” + #引号 + “ -y”, 真, )
    .计次循环尾 ()
    文件_枚举 (“X:\Program Files\Edgeless\”, “*.cmd”, 文件名, 假, )
    .计次循环首 (取数组成员数 (文件名), a)
        运行 (文件名 [a], 真, )
        文件_移动 (文件名 [a], “X:\Program Files\Edgeless\安装程序\” + 文件_取文件名 (文件名 [a], 真))
    .计次循环尾 ()
    文件_枚举 (“X:\Program Files\Edgeless\”, “*.wcs”, 文件名, 真, )
    .计次循环首 (取数组成员数 (文件名), a)
        运行 (“PECMD.EXE LOAD ” + #引号 + 文件名 [a] + #引号, 真, )
        文件_移动 (文件名 [a], “X:\Program Files\Edgeless\安装程序\” + 文件_取文件名 (文件名 [a], 真))
    .计次循环尾 ()
    结束 ()
    ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
.否则
    运行 (“7z x ” + #引号 + 文件路径 + #引号 + “ ” + #引号 + “-oX:\Program Files\Edgeless\” + #引号 + “ -y”, 真, )
    改变目录 (“X:\Program Files\Edgeless\”)
    文件_枚举 (“X:\Program Files\Edgeless\”, “*.cmd”, 文件名, 假, )
    .计次循环首 (取数组成员数 (文件名), a)
        运行 (“PECMD.EXE EXEC ” + #引号 + 文件名 [a] + #引号, 真, )
        文件_移动 (文件名 [a], “X:\Program Files\Edgeless\安装程序\” + 文件_取文件名 (文件名 [a], 真))
    .计次循环尾 ()

    文件_枚举 (“X:\Program Files\Edgeless\”, “*.wcs”, 文件名, 真, )
    .计次循环首 (取数组成员数 (文件名), a)
        运行 (“PECMD.EXE LOAD ” + #引号 + 文件名 [a] + #引号, 真, )
        文件_移动 (文件名 [a], “X:\Program Files\Edgeless\安装程序\” + 文件_取文件名 (文件名 [a], 真))
    .计次循环尾 ()
    结束 ()

.如果结束

结束 ()



.版本 2

.程序集 程序集2

.子程序 文件_枚举, 整数型, 公开, 枚举某个目录下的指定类型文件;成功返回文件数量;
.参数 欲寻找的目录, 文本型, , 文件目录
.参数 欲寻找的文件名, 文本型, , 如果寻找全部文件可以填入*.*,或*.txt只找txt文件
.参数 文件数组, 文本型, 参考 可空 数组, 用于装载文件数组的变量;把寻找到的文件都放在这个数组里,并返回;
.参数 是否带路径, 逻辑型, 可空, 默认为假; 真=带目录路径,如C:\012.txt; 假=不带,如 012.txt;
.参数 是否按字母排序, 逻辑型, 可空, 默认为假;真=按字母a-z排序  假=不排序
.局部变量 局_文件名, 文本型
.局部变量 局_目录, 文本型

清除数组 (文件数组)
局_目录 = 欲寻找的目录
.如果真 (取文本右边 (局_目录, 1) ≠ “\”)
    局_目录 = 局_目录 + “\”
.如果真结束
局_文件名 = 寻找文件 (局_目录 + 欲寻找的文件名, )
.判断循环首 (局_文件名 ≠ “”)
    .如果 (是否带路径)
        加入成员 (文件数组, 局_目录 + 局_文件名)
    .否则
        加入成员 (文件数组, 局_文件名)
    .如果结束
    系统_处理事件1 ()
    局_文件名 = 寻找文件 (, )
.判断循环尾 ()
.如果真 (是否按字母排序)
    数组_排序 (文件数组, 0, )
.如果真结束
返回 (取数组成员数 (文件数组))

.子程序 系统_处理事件1, , 公开, 暂时转让控制权,以便让 Windows 操作系统有机会处理其它的如用户键盘或鼠标输入等事件。直到操作系统处理并发送完程序队列中的所有事件后,命令才会返回。
.局部变量 CurrMsg, MSG

.判断循环首 (PeekMessageA (CurrMsg, 0, 0, 0, 1))  ' #PM_REMOVE=1接收消息并从队列里除掉。
    TranslateMessage (CurrMsg)
    DispatchMessageA (CurrMsg)  ' 分发消息
.判断循环尾 ()

.子程序 数组_排序, , 公开, 二分法排序.只能对文本数组进行排序,整数数组请用核心支持库的.
.参数 要排序的数组, 文本型, 参考 数组
.参数 排序方式, 字节型, 可空, 可空,默认为0  0=升序排序 1=降序排序
.参数 区分大小写, 逻辑型, 可空, 可空,默认“真”。真=区分大小写,假=不区分
.局部变量 N, 整数型
.局部变量 排序数组, 文本型, , "0"
.局部变量 成员数量, 整数型
.局部变量 高位, 整数型
.局部变量 低位, 整数型
.局部变量 中间位, 整数型
.局部变量 比较结果, 整数型, , , 感谢会员 落雪 提供代码

复制数组 (排序数组, 要排序的数组)
清除数组 (要排序的数组)
.如果真 (是否为空 (区分大小写) = 真)
    区分大小写 = 真
.如果真结束

.计次循环首 (取数组成员数 (排序数组), N)
    .判断开始 (成员数量 = 0)
        插入成员 (要排序的数组, 1, 排序数组 [N])
    .默认

        高位 = 成员数量
        低位 = 1
        中间位 = (高位 + 低位) \ 2
        ' ; API_lstrcmp 通过比较ASCII码进行文本的排序,速度快
        .判断开始 (区分大小写 = 假)
            比较结果 = lstrcmpA (到大写 (排序数组 [N]), 到大写 (要排序的数组 [成员数量]))  ' 不区分就都算大写好了.因为在ACSII码中,大小写字母都是挨着的,所以不会出现"夹"在中间的字符.
        .默认
            比较结果 = lstrcmpA (排序数组 [N], 要排序的数组 [成员数量])
        .判断结束

        .判断开始 (比较结果 ≥ 0)
            插入成员 (要排序的数组, 成员数量 + 1, 排序数组 [N])
        .判断 (lstrcmpA (排序数组 [N], 要排序的数组 [1]) ≤ 0)
            插入成员 (要排序的数组, 1, 排序数组 [N])
        .默认
            .判断循环首 (高位 - 低位 > 1)
                .如果真 (排序数组 [N] = 要排序的数组 [中间位])
                    跳出循环 ()
                .如果真结束
                .如果 (lstrcmpA (排序数组 [N], 要排序的数组 [中间位]) < 0)
                    高位 = 中间位
                .否则
                    低位 = 中间位
                .如果结束
                中间位 = (高位 + 低位) \ 2
            .判断循环尾 ()
            .判断开始 (lstrcmpA (排序数组 [N], 要排序的数组 [中间位]) ≤ 0)
                插入成员 (要排序的数组, 中间位, 排序数组 [N])
            .默认
                插入成员 (要排序的数组, 中间位 + 1, 排序数组 [N])
            .判断结束

        .判断结束

    .判断结束
    成员数量 = 取数组成员数 (要排序的数组)
.计次循环尾 ()
.如果真 (排序方式 = 1)
    数组_反转 (要排序的数组)
.如果真结束


.子程序 创建目录EX, 整数型, 公开, 创建多级目录“D:\1\2\3\4\5”不需要中间一个个创建
.参数 pszPath, 文本型, , 目录的标准路径,最大长度为248-1个字符

返回 (SHCreateDirectoryExA (0, pszPath, 0))

.子程序 数组_反转, , 公开, 数组倒序。数组的第一个成员与最后一个成员互换,第二个和倒数第二个互换,以此类推
.参数 反转的数组, 文本型, 参考 数组
.局部变量 成员数量, 整数型
.局部变量 折中数量, 整数型
.局部变量 临时成员, 文本型
.局部变量 N, 整数型

成员数量 = 取数组成员数 (反转的数组)
折中数量 = 成员数量 ÷ 2
.计次循环首 (折中数量, N)
    临时成员 = 反转的数组 [N]
    反转的数组 [N] = 反转的数组 [成员数量]
    反转的数组 [成员数量] = 临时成员
    成员数量 = 成员数量 - 1
.计次循环尾 ()

.子程序 文件_是否为目录, 逻辑型, , 判断一个路径是否为目录 是目录返回真 是文件或者不存在则返回假
.参数 文件路径, 文本型

.如果真 (文件是否存在 (文件路径) = 假)
    返回 (假)
.如果真结束
返回 (位与 (取文件属性 (文件路径), #子目录) ≠ 0)


.子程序 目录_是否存在, 逻辑型, 公开, 输入一个目录名,判断此目录是否存在
.参数 欲判断的目录名, 文本型, , 传入的目录名不会被改变

返回 (PathIsDirectoryA (欲判断的目录名))

.子程序 文件_移动, 逻辑型, 公开, 移动指定文件到指定的文件位置
.参数 欲移动的文件名, 文本型, , 欲移动的文件名
.参数 移动到的文件名, 文本型, , 移动到的文件名

返回 (MoveFileA (欲移动的文件名, 移动到的文件名))

.子程序 文件_取文件名, 文本型, 公开, 如:局_项数组:\123.exe 成功返回123
.参数 路径文件名, 文本型, , 文件完整地址
.参数 是否带后缀, 逻辑型, 可空, 默认为假,不带后缀;真为带后缀
.局部变量 局_文件名, 文本型

局_文件名 = PathFindFileNameA (路径文件名)
.如果真 (取文本右边 (局_文件名, 1) = “\”)
    ' 取出来了一个\,这表示不正确,返回空
    返回 (“”)
.如果真结束
返回 (选择 (是否带后缀, 局_文件名, 取文本左边 (局_文件名, 取文本长度 (局_文件名) - 取文本长度 (文件_取扩展名 (局_文件名)))))

.子程序 文件_取扩展名, 文本型, 公开, 返回一个文件的后缀名,如:.jpg  如果没有后缀,返回空
.参数 文件名, 文本型, , 需要处理的原始文件名

返回 (PathFindExtensionA (文件名))


.版本 2

.数据类型 MSG
    .成员 hwnd, 整数型
    .成员 message, 整数型
    .成员 wParam, 整数型
    .成员 lParam, 整数型
    .成员 time, 整数型
    .成员 pt, POINT

.数据类型 POINT, , -
    .成员 x, 整数型, , , 横坐标
    .成员 y, 整数型, , , 纵坐标

.版本 2

.DLL命令 PathIsDirectoryA, 逻辑型, "shlwapi", "PathIsDirectoryA"
    .参数 pszPath, 文本型, , 0

.DLL命令 PeekMessageA, 逻辑型, "user32", "PeekMessageA", , 该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。
    .参数 lpMsg, MSG, , 0
    .参数 hWnd, 整数型, , 0
    .参数 wMsgFilterMin, 整数型, , 0
    .参数 wMsgFilterMax, 整数型, , 0
    .参数 wRemoveMsg, 整数型, , 0

.DLL命令 lstrcmpA, 整数型, "kernel32", "lstrcmpA"
    .参数 lpString1, 文本型, , 0
    .参数 lpString2, 文本型, , 0

.DLL命令 TranslateMessage, 整数型, "user32", "TranslateMessage", , 转换虚拟关键字消息
    .参数 lpMsg, MSG

.DLL命令 DispatchMessageA, 长整数型, "user32", "DispatchMessageA"
    .参数 a1, MSG, , 0

.DLL命令 SHCreateDirectoryExA, 整数型, "shell32.dll", "SHCreateDirectoryExA", 公开, 创建一个具有可选安全性属性的新文件系统文件夹
    .参数 hwnd, 整数型, , NULL
    .参数 pszPath, 文本型, , 目录的标准路径,最大长度为248-1个字符
    .参数 psa, , , NULL

.DLL命令 MoveFileA, 逻辑型, "kernel32.dll", "MoveFileA", , 移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx,非零表示成功,零表示失败。会设置GetLastError
    .参数 lpExistingFileName, 文本型, , 欲移动的文件名
    .参数 lpNewFileName, 文本型, , 新文件名

.DLL命令 PathFindFileNameA, 文本型, "shlwapi.dll", "PathFindFileNameA", , 文件路径取文件名
    .参数 pszPath, 文本型, , 要取文件名的文件路径

.DLL命令 PathFindExtensionA, 文本型, "shlwapi.dll", "PathFindExtensionA", , 获取绝对路径或文件名中的文件扩展名。如果扩展名找到则返回pszPath字符串中“.”所在地址,否则返回空字符结尾地址。
    .参数 pszPath, 文本型, , 指向以0结尾,最大长度为MAX_PATH文件路径字符串指针。备注:一个有效的扩展名是不包括空格的。






回复

使用道具 举报

2#
发表于 2023-11-2 12:19:02 | 只看该作者
good !!!
回复

使用道具 举报

3#
发表于 2023-11-18 06:21:48 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4#
发表于 2023-11-18 09:52:03 | 只看该作者
Edgeless PE里面不是有现成的加载器么
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-1-31 14:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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