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

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

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

使用道具 举报

发表于 10 小时前 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 10 小时前 | 显示全部楼层
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
复制代码

点评

那个 .cmd 运行屏幕卡死  详情 回复 发表于 9 小时前
老师可否发一个 Visual Studio 命令行 或 MinGW 编译成的 exe 文件,我不会呀  详情 回复 发表于 10 小时前
非常感谢,大神出手啥都可以有  详情 回复 发表于 10 小时前
回复

使用道具 举报

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

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

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

使用道具 举报

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

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

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

使用道具 举报

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

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

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

使用道具 举报

发表于 8 小时前 | 显示全部楼层
等热心人来
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
DrvIndex.exe 这是个啥? 问题源码没有啊。。。
应该就是判断一下。。。完成。。。再继续下去的事。。。

点评

大元帅出马,啥都不是问题!  发表于 3 小时前
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
  来了解下
回复

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
哪位把 4 楼 a 大的C语言代码给编译出来?谢谢
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层
本帖最後由 absman1972 於 2026-4-6 19:21 編輯

楼主不要把简单的问题复杂化
3 楼是正解,重点不在于进度条,而是让 PECMD 等待完成
帮助里的 EXEC 说明节录如下:※-wait或前导"="表示等待执行完成;
如果不修改 PECMD 代码的写法,额外加进度条也无法解决问题

修改后的写法类似
EXEC -wait %ProgramFiles%\DrvIndex\DrvIndex.exe -h



点评

-wait 或 = 是可以等待该进程完成而后执行下面的代码,但如果加载大点体积的驱动文件,如Audio.7z,就会出现屏幕很长时间的空白等待,如果有一个进度管理界面,就显示此时程序运行的情况,屏幕上也有美感。如果用 TE  详情 回复 发表于 1 小时前
回复

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
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:22
-wait 或 = 是可以等待该进程完成而后执行下面的代码,但如果加载大点体积的驱动文件,如Audio.7z,就会 ...

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

点评

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

使用道具 举报

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

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

点评

网卡驱动离线注入,开机不能自动 wifi,你指的是哪个PE ? 我的PE都是支持自动 wifi 的啊  详情 回复 发表于 5 分钟前
回复

使用道具 举报

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-6 21:28

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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