@echo off
chcp 65001 >nul
setlocal EnableExtensions

title Windows CPU 核心限制一键修复

:: ============================================================
:: 检查管理员权限，不是管理员则自动申请
:: ============================================================
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo 正在申请管理员权限...
    powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "Start-Process -FilePath '%~f0' -Verb RunAs"
    exit /b
)

cls
echo ============================================================
echo        Windows CPU 核心 / 逻辑处理器限制修复工具
echo ============================================================
echo.
echo 本脚本将执行：
echo.
echo   1. 备份当前 BCD 启动配置
echo   2. 删除 numproc 处理器数量限制
echo   3. 删除 onecpu 单处理器限制
echo   4. 删除 groupsize 处理器组限制
echo   5. 显示当前 Windows 检测到的 CPU 信息
echo   6. 自动重新启动计算机
echo.
echo ============================================================
echo.

:: ============================================================
:: 创建备份目录
:: ============================================================
if not exist "C:\CPU_Fix_Backup" (
    mkdir "C:\CPU_Fix_Backup"
)

:: 使用 PowerShell 获取时间，避免不同系统日期格式问题
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd_HHmmss"') do set TIMESTAMP=%%i

set BACKUP=C:\CPU_Fix_Backup\BCD_%TIMESTAMP%.bak

echo [1/5] 正在备份 BCD...
bcdedit /export "%BACKUP%"

if %errorlevel% equ 0 (
    echo BCD 已备份到：
    echo %BACKUP%
) else (
    echo.
    echo [警告] BCD 备份失败。
    echo 脚本将停止，以避免直接修改启动配置。
    echo.
    pause
    exit /b 1
)

echo.
echo ============================================================
echo [2/5] 当前 BCD CPU 相关配置：
echo ============================================================
echo.

bcdedit /enum {current} | findstr /i "numproc onecpu groupsize"

echo.
echo ============================================================
echo [3/5] 正在删除 CPU 限制参数...
echo ============================================================
echo.

echo 删除 numproc...
bcdedit /deletevalue {current} numproc >nul 2>&1

if %errorlevel% equ 0 (
    echo [成功] 已删除 numproc CPU 数量限制。
) else (
    echo [正常] 未发现 numproc 限制。
)

echo.

echo 删除 onecpu...
bcdedit /deletevalue {current} onecpu >nul 2>&1

if %errorlevel% equ 0 (
    echo [成功] 已删除 onecpu 单 CPU 限制。
) else (
    echo [正常] 未发现 onecpu 限制。
)

echo.

echo 删除 groupsize...
bcdedit /deletevalue {current} groupsize >nul 2>&1

if %errorlevel% equ 0 (
    echo [成功] 已删除 groupsize 限制。
) else (
    echo [正常] 未发现 groupsize 限制。
)

echo.
echo ============================================================
echo [4/5] 修复后的 CPU 相关 BCD 配置：
echo ============================================================
echo.

bcdedit /enum {current} | findstr /i "numproc onecpu groupsize"

echo.
echo 如果上方没有显示 numproc / onecpu / groupsize，
echo 表示相关启动限制已经清除。
echo.

echo ============================================================
echo [5/5] 当前 Windows 检测到的 CPU 信息
echo ============================================================
echo.

powershell -NoProfile -Command ^
"Get-CimInstance Win32_ComputerSystem | Format-List NumberOfProcessors,NumberOfLogicalProcessors"

echo.
powershell -NoProfile -Command ^
"Get-CimInstance Win32_Processor | Format-Table DeviceID,Name,NumberOfCores,NumberOfLogicalProcessors,SocketDesignation -AutoSize"

echo.
echo ============================================================
echo 修复操作完成
echo ============================================================
echo.
echo 请注意：
echo.
echo 如果重新启动以后任务管理器仍然只有 2 个逻辑处理器，
echo 而设备管理器里面仍然显示 8 个处理器，
echo 那么基本可以判断不是 Windows 镜像的问题，
echo 而是红帽 QEMU/KVM 的 CPU Socket / Core 拓扑配置问题。
echo.
echo 理想配置应该类似：
echo.
echo     1 Socket x 8 Core x 1 Thread
echo.
echo 或：
echo.
echo     2 Socket x 4 Core x 1 Thread
echo.
echo 而不是：
echo.
echo     8 Socket x 1 Core x 1 Thread
echo.
echo ============================================================
echo.
echo 系统将在 15 秒后重新启动。
echo 如需取消重启，请立即按 Ctrl+C。
echo.

timeout /t 15

shutdown /r /t 0

endlocal