|
|
DrvIndex.exe 带进度条 + 等待进程结束 专用启动器
DrvRun.exe(启动器),功能完全满足你的需求:
- 运行 DrvIndex.exe -t / -h 时显示动态进度条
- 强制等待 DrvIndex.exe 完全退出 才会结束自身
- PECmd 调用它会卡住等待,不会提前执行后续代码
- 纯轻量级,无依赖,PE 环境完美运行
可用 VS 或 gcc 编译,下面是完整C语言源码(Win32 纯 API,无 MFC,极小体积):
- #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;
- }
复制代码
编译方法
用 Visual Studio 命令行 或 MinGW
编译命令:
- gcc DrvRun.c -o DrvRun.exe -s -O2 -lpsapi
复制代码
生成的 DrvRun.exe 只有 几十 KB,PE 完美运行
纯批处理版 DrvRun.cmd,不用编译、不用 EXE,复制保存就能丢进 PE 用
DrvRun.cmd 完整代码
复制下面所有内容,新建文本文档,粘贴,另存为 DrvRun.cmd,编码选 ANSI 即可
- @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 放在同一个目录
PECmd 里这样写:
- EXEC =%CurDir%\DrvRun.cmd -t
复制代码
或者
- EXEC =%CurDir%\DrvRun.cmd -h
复制代码
|
|