|
|
本帖最后由 766266yyn 于 2026-4-13 09:47 编辑
WinPE 启动过程中加载驱动时多用到 DrvIndex.exe -t 或 -h 可自动 Wifi,但发现往往 DrvIndex.exe 进程没有结束,pecmd 就运行以后的代码,甚至桌面加载完了,而 DrvIndex.exe 还没有结束,所以就想搞一个进度条,贯穿 DrvIndex.exe 整个进程,并待 DrvIndex.exe 运行结束后再运行 pecmd 以后的代码。奈何水平太菜,么有这个能力。所以,请哪位大神出手,做一个DrvIndex.exe -t 及 -h 进度条
在无忧论坛求助过,a66老大给出一个c语言代码和cmd代码,奈何本人不会编译,c语言代码使用不了,而cmd代码PE加载直接卡死,求助a66老师不理我了,没办法在此求助。
各位老师如果觉得我又不妥,可直接批评,不要谩骂。或者管理员直接删帖,不要影响论坛清誉。
这里也非常感谢 a66 老师。
a66老师的 CMD 代码:
- @echo off
- chcp 437 >nul
- mode con cols=60 lines=8
- title DrvIndex 加载监控
- set "ARGS=%*"
- echo 正在启动 DrvIndex.exe %ARGS%
- echo.
- :: 启动 DrvIndex.exe
- start /b "" DrvIndex.exe %ARGS%
- :: 进度条动画 + 等待进程结束
- set "p=0"
- :loop
- tasklist | find /i "DrvIndex.exe" >nul
- if errorlevel 1 goto done
- set /a p+=1
- if %p% gtr 50 set p=50
- set "bar="
- for /l %%i in (1,1,%p%) do set "bar=#%bar%"
- for /l %%i in (%p%,1,49) do set "bar=-%bar%"
- echo 加载中: [%bar%]
- cls
- goto loop
- :done
- cls
- echo ============================================================
- echo DrvIndex.exe 已运行完毕
- echo 可继续执行后续 PECmd 命令
- echo ============================================================
- echo.
- ping -n 2 127.0.0.1 >nul
- exit
复制代码
使用方法
把 DrvRun.cmd 和 DrvIndex.exe 放在同一个目录
EXEC =%CurDir%\DrvRun.cmd -t
a66 老师的完整C语言源码, 可用 VS 或 gcc 编译:
- #include <windows.h>
- #include <stdio.h>
- #include <tlhelp32.h>
- // 进度条界面宽度
- #define PROGRESS_WIDTH 50
- // 清空控制台行
- void ClearLine() {
- printf("\r");
- for (int i = 0; i < 80; i++) printf(" ");
- printf("\r");
- }
- // 绘制进度条
- void DrawProgress(int percent) {
- char bar[PROGRESS_WIDTH + 1] = {0};
- int pos = percent * PROGRESS_WIDTH / 100;
- memset(bar, '#', pos);
- memset(bar + pos, '-', PROGRESS_WIDTH - pos);
- printf("\r[DrvIndex 运行中] [%s] %d%% ", bar, percent);
- fflush(stdout);
- }
- // 等待进程结束,并更新进度条
- void WaitProcess(DWORD pid) {
- int pct = 0;
- while (1) {
- HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- PROCESSENTRY32 pe32;
- pe32.dwSize = sizeof(PROCESSENTRY32);
- BOOL found = FALSE;
- if (Process32First(hSnapshot, &pe32)) {
- do {
- if (pe32.th32ProcessID == pid) {
- found = TRUE;
- break;
- }
- } while (Process32Next(hSnapshot, &pe32));
- }
- CloseHandle(hSnapshot);
- if (!found) break;
- // 模拟进度(0-95%)
- if (pct < 95) pct++;
- DrawProgress(pct);
- Sleep(150);
- }
- // 完成
- DrawProgress(100);
- ClearLine();
- printf("[DrvIndex 已完成] 进程已正常退出\n");
- }
- int main(int argc, char* argv[]) {
- // 控制台标题
- SetConsoleTitleA("DrvIndex 进度条启动器");
- // 拼接命令行:DrvIndex.exe + 传入的参数
- char cmd[512] = "DrvIndex.exe ";
- for (int i = 1; i < argc; i++) {
- strcat(cmd, argv[i]);
- strcat(cmd, " ");
- }
- printf("正在启动:%s\n", cmd);
- printf("========================================\n");
- // 创建进程
- STARTUPINFOA si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- ZeroMemory(&pi, sizeof(pi));
- si.cb = sizeof(si);
- if (!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
- printf("错误:无法启动 DrvIndex.exe\n");
- system("pause >nul");
- return 1;
- }
- // 等待进程结束 + 进度条动画
- WaitProcess(pi.dwProcessId);
- // 清理句柄
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- printf("========================================\n");
- printf("可以继续执行后续 PECmd 命令\n\n");
- return 0;
- }
复制代码
|
|