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

请哪位大神出手,做一个DrvIndex.exe -t 及 -h 进度条

[复制链接]
发表于 2026-4-6 10:36:35 | 显示全部楼层 |阅读模式
如题:PE 启动过程中加载驱动时多用到 DrvIndex.exe,-t -h 可自动 Wifi,但发现往往 DrvIndex.exe 进程没有结束,pecmd 就运行以后的代码,甚至桌面加载完了,而 DrvIndex.exe 还没有结束,所以就想搞一个进度条,贯穿 DrvIndex.exe 整个进程,并待 DrvIndex.exe 运行结束后再运行 pecmd 以后的代码。奈何水平太菜,么有这个能力。所以,请哪位大神出手,做一个DrvIndex.exe -t 及 -h 进度条
发表于 2026-4-6 10:38:44 | 显示全部楼层
等大佬出手...........
回复

使用道具 举报

发表于 2026-4-6 10:40:46 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2026-4-6 11:08:54 | 显示全部楼层
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器

DrvRun.exe(启动器),功能完全满足你的需求:
  • 运行 DrvIndex.exe -t / -h 时显示动态进度条
  • 强制等待 DrvIndex.exe 完全退出 才会结束自身
  • PECmd 调用它会卡住等待,不会提前执行后续代码
  • 纯轻量级,无依赖,PE 环境完美运行

可用 VS 或 gcc 编译,下面是完整C语言源码(Win32 纯 API,无 MFC,极小体积):

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <tlhelp32.h>

  4. // 进度条界面宽度
  5. #define PROGRESS_WIDTH 50

  6. // 清空控制台行
  7. void ClearLine() {
  8.     printf("\r");
  9.     for (int i = 0; i < 80; i++) printf(" ");
  10.     printf("\r");
  11. }

  12. // 绘制进度条
  13. void DrawProgress(int percent) {
  14.     char bar[PROGRESS_WIDTH + 1] = {0};
  15.     int pos = percent * PROGRESS_WIDTH / 100;

  16.     memset(bar, '#', pos);
  17.     memset(bar + pos, '-', PROGRESS_WIDTH - pos);

  18.     printf("\r[DrvIndex 运行中] [%s] %d%% ", bar, percent);
  19.     fflush(stdout);
  20. }

  21. // 等待进程结束,并更新进度条
  22. void WaitProcess(DWORD pid) {
  23.     int pct = 0;
  24.     while (1) {
  25.         HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  26.         PROCESSENTRY32 pe32;
  27.         pe32.dwSize = sizeof(PROCESSENTRY32);

  28.         BOOL found = FALSE;
  29.         if (Process32First(hSnapshot, &pe32)) {
  30.             do {
  31.                 if (pe32.th32ProcessID == pid) {
  32.                     found = TRUE;
  33.                     break;
  34.                 }
  35.             } while (Process32Next(hSnapshot, &pe32));
  36.         }
  37.         CloseHandle(hSnapshot);

  38.         if (!found) break;

  39.         // 模拟进度(0-95%)
  40.         if (pct < 95) pct++;
  41.         DrawProgress(pct);
  42.         Sleep(150);
  43.     }

  44.     // 完成
  45.     DrawProgress(100);
  46.     ClearLine();
  47.     printf("[DrvIndex 已完成] 进程已正常退出\n");
  48. }

  49. int main(int argc, char* argv[]) {
  50.     // 控制台标题
  51.     SetConsoleTitleA("DrvIndex 进度条启动器");

  52.     // 拼接命令行:DrvIndex.exe + 传入的参数
  53.     char cmd[512] = "DrvIndex.exe ";
  54.     for (int i = 1; i < argc; i++) {
  55.         strcat(cmd, argv[i]);
  56.         strcat(cmd, " ");
  57.     }

  58.     printf("正在启动:%s\n", cmd);
  59.     printf("========================================\n");

  60.     // 创建进程
  61.     STARTUPINFOA si;
  62.     PROCESS_INFORMATION pi;
  63.     ZeroMemory(&si, sizeof(si));
  64.     ZeroMemory(&pi, sizeof(pi));
  65.     si.cb = sizeof(si);

  66.     if (!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
  67.         printf("错误:无法启动 DrvIndex.exe\n");
  68.         system("pause >nul");
  69.         return 1;
  70.     }

  71.     // 等待进程结束 + 进度条动画
  72.     WaitProcess(pi.dwProcessId);

  73.     // 清理句柄
  74.     CloseHandle(pi.hProcess);
  75.     CloseHandle(pi.hThread);

  76.     printf("========================================\n");
  77.     printf("可以继续执行后续 PECmd 命令\n\n");
  78.     return 0;
  79. }
复制代码


编译方法

用 Visual Studio 命令行 或 MinGW

编译命令:
  1. gcc DrvRun.c -o DrvRun.exe -s -O2 -lpsapi
复制代码


生成的 DrvRun.exe 只有 几十 KB,PE 完美运行


纯批处理版 DrvRun.cmd,不用编译、不用 EXE,复制保存就能丢进 PE 用

DrvRun.cmd 完整代码
复制下面所有内容,新建文本文档,粘贴,另存为 DrvRun.cmd,编码选 ANSI 即可

  1. @echo off
  2. chcp 437 >nul
  3. mode con cols=60 lines=8
  4. title DrvIndex 加载监控

  5. set "ARGS=%*"
  6. echo 正在启动 DrvIndex.exe %ARGS%
  7. echo.

  8. :: 启动 DrvIndex.exe
  9. start /b "" DrvIndex.exe %ARGS%

  10. :: 进度条动画 + 等待进程结束
  11. set "p=0"
  12. :loop
  13. tasklist | find /i "DrvIndex.exe" >nul
  14. if errorlevel 1 goto done

  15. set /a p+=1
  16. if %p% gtr 50 set p=50

  17. set "bar="
  18. for /l %%i in (1,1,%p%) do set "bar=#%bar%"
  19. for /l %%i in (%p%,1,49) do set "bar=-%bar%"

  20. echo 加载中: [%bar%]
  21. cls
  22. goto loop

  23. :done
  24. cls
  25. echo ============================================================
  26. echo  DrvIndex.exe 已运行完毕
  27. echo  可继续执行后续 PECmd 命令
  28. echo ============================================================
  29. echo.
  30. ping -n 2 127.0.0.1 >nul
  31. exit
复制代码




使用方法

    把 DrvRun.cmd 和 DrvIndex.exe 放在同一个目录
    PECmd 里这样写:
  1. EXEC =%CurDir%\DrvRun.cmd -t
复制代码


    或者
  1. EXEC =%CurDir%\DrvRun.cmd -h
复制代码

点评

a大,搞一个exe的来嘛,那个cmd不行啊  详情 回复 发表于 2026-4-13 07:48
那个 .cmd 运行屏幕卡死  详情 回复 发表于 2026-4-6 12:01
老师可否发一个 Visual Studio 命令行 或 MinGW 编译成的 exe 文件,我不会呀  详情 回复 发表于 2026-4-6 11:23
非常感谢,大神出手啥都可以有  详情 回复 发表于 2026-4-6 11:12
回复

使用道具 举报

 楼主| 发表于 2026-4-6 11:12:47 | 显示全部楼层
a66 发表于 2026-4-6 11:08
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器

DrvRun.exe(启动器),功能完全满足你的需求:

非常感谢,大神出手啥都可以有
回复

使用道具 举报

 楼主| 发表于 2026-4-6 11:23:21 | 显示全部楼层
a66 发表于 2026-4-6 11:08
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器

DrvRun.exe(启动器),功能完全满足你的需求:

老师可否发一个 Visual Studio 命令行 或 MinGW 编译成的 exe 文件,我不会呀
回复

使用道具 举报

 楼主| 发表于 2026-4-6 12:01:47 | 显示全部楼层
a66 发表于 2026-4-6 11:08
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器

DrvRun.exe(启动器),功能完全满足你的需求:

那个 .cmd 运行屏幕卡死
回复

使用道具 举报

发表于 2026-4-6 13:12:03 | 显示全部楼层
等热心人来
回复

使用道具 举报

发表于 2026-4-6 13:40:09 | 显示全部楼层
DrvIndex.exe 这是个啥? 问题源码没有啊。。。
应该就是判断一下。。。完成。。。再继续下去的事。。。
回复

使用道具 举报

发表于 2026-4-6 13:42:10 | 显示全部楼层
  来了解下
回复

使用道具 举报

 楼主| 发表于 2026-4-6 18:58:40 | 显示全部楼层
哪位把 4 楼 a 大的C语言代码给编译出来?谢谢
回复

使用道具 举报

 楼主| 发表于 2026-4-6 20:22:25 | 显示全部楼层
absman1972 发表于 2026-4-6 19:20
本帖最後由 absman1972 於 2026-4-6 19:21 編輯

楼主不要把简单的问题复杂化

-wait 或 = 是可以等待该进程完成而后执行下面的代码,但如果加载大点体积的驱动文件,如Audio.7z,就会出现屏幕很长时间的空白等待,如果有一个进度管理界面,就显示此时程序运行的情况,屏幕上也有美感。如果用 TEXT 在高分屏上显示正常的字体,在低分屏上字体显示特别大,反之在低分屏显示正常大小的字体,在高分屏上又特别小。用 TIPS 托盘消息也是同样的问题。
DrvIndex.exe 有自身的进度显示条,但不会等待自身进程结束再运行后面的代码,如果加上参数 -wait,则又不会显示其自身的进度条

点评

PE 的驱动,要的其实没几个,最主要的也就是个网卡驱动,离线注入PE即可,其他的驱动可有可无,要在线导入那么多驱动干嘛,毫无用处,还占用PE启动时间。  详情 回复 发表于 2026-4-6 20:48
回复

使用道具 举报

发表于 2026-4-6 20:48:32 | 显示全部楼层
静庵 发表于 2026-4-6 20:22
-wait 或 = 是可以等待该进程完成而后执行下面的代码,但如果加载大点体积的驱动文件,如Audio.7z,就会 ...

PE 的驱动,要的其实没几个,最主要的也就是个网卡驱动,离线注入PE即可,其他的驱动可有可无,要在线导入那么多驱动干嘛,毫无用处,还占用PE启动时间。

点评

说的很对,我也很奇怪,把网卡和声卡驱动离线注入,开机不能自动 wifi,必须手动输入密码,如果在 pecmd.ini中 上 EXEC ...... DrvIndex.exe -t 或 -h,即便是目录中没有 .7z文件,也可以自动连上 wifi  详情 回复 发表于 2026-4-6 21:01
回复

使用道具 举报

 楼主| 发表于 2026-4-6 21:01:29 | 显示全部楼层
martin313 发表于 2026-4-6 20:48
PE 的驱动,要的其实没几个,最主要的也就是个网卡驱动,离线注入PE即可,其他的驱动可有可无,要在线导 ...

说的很对,我也很奇怪,把网卡和声卡驱动离线注入,开机不能自动 wifi,必须手动输入密码,如果在 pecmd.ini中 上 EXEC ...... DrvIndex.exe -t 或 -h,即便是目录中没有 .7z文件,也可以自动连上 wifi

点评

是网络自动连接工具wireless.exe(或其它类似工具)起的作用,能自动识别本地桌面系统已保存过的上网密码,本地桌面系统如果没保存过则不行。  发表于 前天 20:59
因为L大的工具带的自动解密离线系统存在的WIFI密码并自动连接的功能  详情 回复 发表于 2026-4-7 20:51
网卡驱动离线注入,开机不能自动 wifi,你指的是哪个PE ? 我的PE都是支持自动 wifi 的啊  详情 回复 发表于 2026-4-6 21:22
回复

使用道具 举报

发表于 2026-4-6 21:22:55 | 显示全部楼层
静庵 发表于 2026-4-6 21:01
说的很对,我也很奇怪,把网卡和声卡驱动离线注入,开机不能自动 wifi,必须手动输入密码,如果在 pecmd. ...

网卡驱动离线注入,开机不能自动 wifi,你指的是哪个PE ?

我的PE都是支持自动 wifi 的啊
回复

使用道具 举报

发表于 2026-4-7 20:51:37 | 显示全部楼层
静庵 发表于 2026-4-6 21:01
说的很对,我也很奇怪,把网卡和声卡驱动离线注入,开机不能自动 wifi,必须手动输入密码,如果在 pecmd. ...

因为L大的工具带的自动解密离线系统存在的WIFI密码并自动连接的功能

点评

前提是桌面系统已经成功连接过wifi,保存有连接密码。  发表于 前天 20:56
回复

使用道具 举报

 楼主| 发表于 2026-4-13 07:48:51 | 显示全部楼层
a66 发表于 2026-4-6 11:08
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器

DrvRun.exe(启动器),功能完全满足你的需求:

a大,搞一个exe的来嘛,那个cmd不行啊
回复

使用道具 举报

发表于 2026-4-14 10:49:15 | 显示全部楼层
不会做,抱歉
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
回复

使用道具 举报

发表于 前天 10:18 | 显示全部楼层
@Lightning  DRVINDEX...有此功能没有:对于7Z包的解压安装时有密码参数的安装时增加一个不带密码的尝试功能。
即加密和不加密的 7Z驱动包在一起时都要检索安装。

点评

没有@Lightning DRVINDEX  详情 回复 发表于 前天 20:17
回复

使用道具 举报

 楼主| 发表于 前天 20:17 | 显示全部楼层
liker 发表于 2026-4-23 10:18
@Lightning  DRVINDEX...有此功能没有:对于7Z包的解压安装时有密码参数的安装时增加一个不带密码的尝试功 ...

没有@Lightning  DRVINDEX
回复

使用道具 举报

发表于 前天 20:53 | 显示全部楼层
DrvIndex.exe 应该自带进度条,根据驱动安装时长情况应该会显示。解决安装等待问题有两个办法:
1、加 = 参数,等待命令完成后再执行下一条命令;
2、将DrvIndex.exe作为PE内的一个功能项,让用户在进入PE桌面后,自行选择是否执行驱动安装,这样更合理;

点评

对的,DrvIndex.exe 前导不加任何参数情况下(如=、-wait等 pecmd 的 EXEC 参数)自带进度条,如果加 = 就不会出现进度条了,其实我想解决的正是:既等待 DrvIndex.exe 运行完成后在运行后面的代码,在这个过程中使  详情 回复 发表于 前天 21:27
回复

使用道具 举报

发表于 前天 21:19 | 显示全部楼层
把你PECMD加载 DrvIndex.exe 代码发出来 pecmd代码加载等待可以解决
比如这样我是这样  FORX !"\PETOOLS\Driver\DrvIndex.exe",&Index,1, THREAD* TEAM WAIT 500|EXEC %&Index% -t

点评

我就是简单的 EXEC %ProgramFiles%\DrvIndex\DrvIndeex.exe -t  详情 回复 发表于 前天 22:35
回复

使用道具 举报

 楼主| 发表于 前天 21:27 | 显示全部楼层
lhc0688 发表于 2026-4-23 20:53
DrvIndex.exe 应该自带进度条,根据驱动安装时长情况应该会显示。解决安装等待问题有两个办法:
1、加 = 参 ...

对的,DrvIndex.exe 前导不加任何参数情况下(如=、-wait等 pecmd 的 EXEC 参数)自带进度条,如果加 = 就不会出现进度条了,其实我想解决的正是:既等待 DrvIndex.exe 运行完成后在运行后面的代码,在这个过程中使屏幕不那么单调(加上 = 就没有进度条了),比如 MESS 或 TEXT 显示一个信息:正在安装本地驱动 。。。,问题是用 MESS、TEXT 时长不好控制,如果仅在一台电脑上可以,但其它电脑上加载时长就不一样了。所以是想寻求什么办法判断 DrvIndex.exe 进程结束后再运行后面的命令。
当然可以在桌面加载完成后再启动运行 DrvIndex.exe ,我不是想让 PE 模仿正常系统,进到桌面就已经是连上网络了
回复

使用道具 举报

发表于 前天 21:30 | 显示全部楼层
需要慢慢等待

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

 楼主| 发表于 前天 22:35 | 显示全部楼层
反向人 发表于 2026-4-23 21:19
把你PECMD加载 DrvIndex.exe 代码发出来 pecmd代码加载等待可以解决
比如这样我是这样  FORX !"\PETOOLS\Dr ...

我就是简单的 EXEC %ProgramFiles%\DrvIndex\DrvIndeex.exe -t
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 16:56

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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