无忧启动论坛

标题: 求教(已解决,pecmd脚本方案)判断当前系统是否为 uefi [打印本页]

作者: dos时代菜鸟    时间: 2019-3-24 22:52
标题: 求教(已解决,pecmd脚本方案)判断当前系统是否为 uefi
本帖最后由 dos时代菜鸟 于 2021-6-18 12:30 编辑

问题已经解决,
感谢 liuzhaoyzz 、窄口牛 、adef 、liuzhaoyzz 等诸位大侠的热心回复和提供的思路。

我想弄个 cmd 实现这个功能,进而判断 系统启动类型是 uefi 还是 leagy-bios

鉴于 2021新版win10 已经不能使用以往  call dll函数 的方式,

针对新版win10 改进了一下,用了另一个 api

bootmode-2021.06.18.7z (1.82 MB, 下载次数: 97)

  1.     ENVI$# &ret=*4 0     //申请4个窄字符空间,也可以用   ENVI$ &ret=*2 0 //申请2个宽字符空间
  2.     CALL $--qd --bool --ret:&&r Kernel32.dll,GetFirmwareType,*&ret
  3.     FIND $%&&r%=,
  4.     {*
  5.         //为空,可以认为没有返回数据,当前环境不支持此API,低于Win8版本的系统
  6.         //MESS. 不支持此API。
  7.                 CALL $ --ret:r Kernel32.dll,GetFirmwareEnvironmentVariableW,"",{00000000-0000-0000-0000-000000000000},0,0
  8.                 CALL $ --ret:mode1 Kernel32.dll,GetLastError, ""
  9.                 IFEX $%mode1% = 1 ,envi BootMODE=BIOS! find $%mode1%=998 ,envi BootMODE=UEFI ! envi BootMODE=???1
  10.     }!  
  11.     {*
  12.         IFEX #%&&r%=0,MESS API Error.!  
  13.         {*
  14.             ENVI?int &ret=&ret1
  15.             IFEX #%&ret1%=0,envi BootMODE=???0。
  16.             IFEX #%&ret1%=1,envi BootMODE=BIOS
  17.             IFEX #%&ret1%=2,envi BootMODE=UEFI
  18.             IFEX #%&ret1%=3,envi BootMODE=???9
  19.         }
  20.     }
  21. mess %Bootmode%
复制代码




2021新版 pecmd 也有所改进,
改进后 的 如下:2021.01.14
bootmode.2021.2.7z (1.67 MB, 下载次数: 160)






PE下 用pecmd 脚本 bootmode.7z (1.82 MB, 下载次数: 258) 压缩包中包含 pecmd x86 /x64 所以在 本地 windows下也可以用。
有的  PE 因为 pecmd 版本不同 有的 call 指令略有不同,需要 自行对 bm.ini 进行修改。压缩包中的 pecmd 是 2018新版

脚本解决方案 是 调用 pecmd 加载 kernel32.dll 的 api 句柄
按照网上流行的做法 ,本质就是 通过 给 GetFirmwareEnvironmentVariableW 函数一个 错误的信息,其返回值必为0 ,但是其 错误代码返回值就不一样了。如果错误代码返回 1 说明是 bios ,代表 当前系统不支持 该函数运行,如果 错误代码返回值为 998 ,说明 该句柄运行了,但是运行错误。
值得一提的是,必须 将 kernel32.dll 的  GetFirmwareEnvironmentVariableW  和 getLastError 两个函数 紧连着使用,以便能够获取 真正的错误返回码。
所以 考虑 用 team 命令将两个 call 链接起来。
pecmd 脚本内容如下:
(根据自身 pecmd 版本 需要将下面源码中 红色部分修改  比如 2017版 pecmd 需要把 ** 变成 --)
--------------
  1. TEAM CALL $ --ret:mode1 Kernel32.dll,GetFirmwareEnvironmentVariableW, "",{00000000-0000-0000-0000-000000000000},0,0 | CALL $ --ret:mode1 Kernel32.dll,GetLastError, ""
  2. IFEX $%mode1% = 1 ,ENVI MODE1=BIOS! find $%mode1%=998 ,ENVI MODE1=UEFI ! ENVI MODE1=Unknow
  3. MESS %mode1%
复制代码
----------------------


exe 方案 用这个 detectefi.7z (22.24 KB, 下载次数: 143) 由 adef 提供,很好用。

如果是 win10 系统 powershell 3.0 的话 可以尝试用这个
bmx.7z (576 Bytes, 下载次数: 84)

如果你的系统 可以运行 bcdedit 列出 bcd 内容,可以用这个
B2.7z (896 Bytes, 下载次数: 104)





作者: dos时代菜鸟    时间: 2019-3-24 23:34
通过 {current }可以半段 当前系统 对应的 bcd 选项。

作者: 窄口牛    时间: 2019-3-24 23:39
bcd判断不了,还得用其它方法,有个第三方命令可以。
作者: dos时代菜鸟    时间: 2019-3-24 23:54
frg521 发表于 2019-3-24 23:32
...

如果删除了 path ,bootmgr 如何知道用什么文件引导进入 windows ,这个技术我还没接触过。一定是 还修改了其他地方 以 与之对应。还请赐教。
作者: dos时代菜鸟    时间: 2019-3-24 23:55
本帖最后由 dos时代菜鸟 于 2019-3-24 23:59 编辑
窄口牛 发表于 2019-3-24 23:39
bcd判断不了,还得用其它方法,有个第三方命令可以。


第三方命令 是 用  api dll 编的 那个 吧。或者用  au3



如果 存在 path 就可以通过 exe /efi 判断出
至于 pe 可这样:
  1. for /f "tokens=2* delims=  " %%A in ('reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') DO SET Firmware=%%B
  2. :: Note: delims is a TAB followed by a space.
  3. if %Firmware%==0x1 echo The PC is booted in BIOS mode.
  4. if %Firmware%==0x2 echo The PC is booted in UEFI mode.
复制代码

作者: dos时代菜鸟    时间: 2019-3-25 00:02
frg521 发表于 2019-3-24 23:58
...

那可能就是 bootmgr  通过自己的 类型 加载 winload 的 类型了吧。这个就 有些难办了。
作者: 窄口牛    时间: 2019-3-25 08:12
启动模式传递过来了,只能对应efi或者exe去启动,所以bcd里并不需要指明这个,只需要是哪个盘哪个分区或者哪里的哪个镜像文件。
作者: dos时代菜鸟    时间: 2019-3-25 09:36
本帖最后由 dos时代菜鸟 于 2019-3-25 10:20 编辑

刚才测试了下 win10 的 bcd  没有 path 的情况

leagy uefi  模式下 启动项不指定 "path = ....winload.exe"  都可以启动

值得一提的是 uefi 模式下 会在 {bootmgr} 项目中增加一个 path 并指定 bootmgrfw.efi 作为启动 bcd 的引导器,即便把 {bootmgr} 中的这个 path 删掉,系统也会在启动的时候 加上,运行 "bcdedit  /enum “也会自动加上.
不知道是否是个例,还是普遍现象,如果普遍如此,就可以据此判断系统是否为 uefi 模式启动了。

也就是如果 {bootmgr} 项中 有定义 path 且其指向一个 .efi 文件,就说明是 uefi 启动。否则就是 leagy-bios 模式启动。???
似乎也不妥,如果用 bcdedit /deletevalue 的方式删除 {bootmgr} 中的 path ,系统就不会 回填 path 值了。
而且 leagy-bios 模式 下,bcd 中{bootmgr} 的path 没啥用,如果 leagy-bios中 {bootmgr}的path值乱写,也会影响判断。






如下图,{bootmgr} 项目中 path 已经删除,运行 bcdedit 还是会 自动把 path 加上。重启也会。



  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set /a n=0
  4. set /a current_n=-1
  5. set /a bootmgr_n=-1
  6. for /f "tokens=1* delims= " %%a in ('bcdedit /enum ') do (
  7.   set "lx=%%a" &  if /i "!lx:~0,1!"=="-" set /a n+=1
  8.   set "!n!_%%a=%%b"
  9.   if /i "%%b"=="{current}" (set /a current_n=!n!)
  10.   if /i "%%b"=="{bootmgr}" (set /a bootmgr_n=!n!)
  11. )

  12. set "boot_mode=Legacy-BIOS"
  13. IF defined !bootmgr_n!_path (
  14.   for %%c in (!bootmgr_n!) do ( for %%q in (!%%c_path!) do (
  15.       if /i "%%~xq"==".efi" set "boot_mode=UEFI"
  16.   ))
  17. )

  18. ECHO.
  19. ECHO    BCD启动项列表(!boot_mode!):
  20. for /l %%n in (1,1,!n!) do (
  21.   set "item_type="
  22.   if %%n equ !current_n! ( set "item_type={Current}")
  23.   if %%n equ !bootmgr_n! ( set "item_type={Bootmgr}")
  24.   echo   ---%%n---!item_type!------------
  25.   for %%a in (description,device,systemroot,path) do (
  26.        set "lx=            %%a" & set "lx=!lx:~-12!"
  27.        if defined %%n_%%a  echo   !lx! : "!%%n_%%a!"
  28.   )
  29. )
  30. ECHO ---------------------------
  31. echo.

  32. pause
复制代码

作者: 2012jiashanni    时间: 2019-3-25 09:44
很简单  判断启动文件是否是EFI  当然了  PE下无效
作者: dos时代菜鸟    时间: 2019-3-25 10:17
2012jiashanni 发表于 2019-3-25 09:44
很简单  判断启动文件是否是EFI  当然了  PE下无效

bcd 中记载的 path 项目 是可以删掉的,丝毫不影响系统启动。

作者: 窄口牛    时间: 2019-3-25 10:23
一般人的电脑上,你这么判断多半不会错,但是鼓捣引导的人机器上就不行了。
作者: dos时代菜鸟    时间: 2019-3-25 10:41
本帖最后由 dos时代菜鸟 于 2019-3-25 10:49 编辑
窄口牛 发表于 2019-3-25 10:23
一般人的电脑上,你这么判断多半不会错,但是鼓捣引导的人机器上就不行了。

是的,奇葩情况比较难搞
看看这个,在探测 bcd 前先删掉 {bootmgr} 中的 path ,如果 bcdedit 能够回填 ,那一定是 efi 的启动模式了。


  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set /a n=0
  4. set /a current_n=-1
  5. set /a bootmgr_n=-1
  6. bcdedit /deletevalue {bootmgr} path
  7. for /f "tokens=1* delims= " %%a in ('bcdedit /enum ') do (
  8.   set "lx=%%a" &  if /i "!lx:~0,1!"=="-" set /a n+=1
  9.   set "!n!_%%a=%%b"
  10.   if /i "%%b"=="{current}" (set /a current_n=!n!)
  11.   if /i "%%b"=="{bootmgr}" (set /a bootmgr_n=!n!)
  12. )

  13. set "boot_mode=-1"
  14. IF defined !current_n!_path (
  15.   for %%c in (!current_n!) do ( for %%q in (!%%c_path!) do (
  16.       if /i "%%~xq"==".efi" set "boot_mode=UEFI"
  17.       if /i "%%~xq"==".exe" set "boot_mode=Leagcy-Bios"
  18.   ))
  19. )
  20. if !boot_mode! equ -1 (IF defined !bootmgr_n!_path (
  21.   for %%c in (!bootmgr_n!) do ( for %%q in (!%%c_path!) do (
  22.       if /i "%%~xq"==".efi" set "boot_mode=UEFI"
  23.   ))
  24. ))
  25. ECHO.
  26. ECHO    BCD启动项列表(!boot_mode!):
  27. for /l %%n in (1,1,!n!) do (
  28.   set "item_type="
  29.   if %%n equ !current_n! ( set "item_type={Current}")
  30.   if %%n equ !bootmgr_n! ( set "item_type={Bootmgr}")
  31.   echo   ---%%n---!item_type!------------
  32.   for %%a in (description,device,systemroot,path) do (
  33.        set "lx=            %%a" & set "lx=!lx:~-12!"
  34.        if defined %%n_%%a  echo   !lx! : "!%%n_%%a!"
  35.   )
  36. )
  37. ECHO ---------------------------
  38. echo.

  39. pause
复制代码


作者: 窄口牛    时间: 2019-3-25 10:47
那个第三方可以,我试了,因为我的bcd路径根本就不是常规的位置,它可以正确判断,但是我现在的精简版系统支持不全,它运行不了。
作者: 窄口牛    时间: 2019-3-25 10:49
我之前的h77是不允许多硬盘混合引导的,现在的主板是可以的。想怎么启动就怎么启动,想往哪装系统就往哪装。
作者: dos时代菜鸟    时间: 2019-3-25 10:53
窄口牛 发表于 2019-3-25 10:47
那个第三方可以,我试了,因为我的bcd路径根本就不是常规的位置,它可以正确判断,但是我现在的精简版系统 ...

要是 bcd 位置变动 bcdedit 能读取出来么?
如果能,可以尝试 用 bcdedit /deletevalue 把 {bootmgr} 的 path 删掉,然后再 bcdedit /enum ,看 {bootmgr} 的 path 是什么,如果能回填出来,path 指向的扩展名是 efi 那肯定是 uefi 启动的。

我刚弄了个 cmd 好像可以了,{bootmgr}的内容,开始我是 用 /set 修改 path ,结果不回填,但是要是 path 被干掉了,bcdedit 就会 给再填一个。这个在 leagcy-bios 模式 不回填。
作者: 2012jiashanni    时间: 2019-3-25 11:23
dos时代菜鸟 发表于 2019-3-25 10:17
bcd 中记载的 path 项目 是可以删掉的,丝毫不影响系统启动。

我用的API
作者: 窄口牛    时间: 2019-3-25 11:48
找不到,它找不到bcd的正确位置。
作者: dos时代菜鸟    时间: 2019-3-25 11:52
窄口牛 发表于 2019-3-25 11:48
找不到,它找不到bcd的正确位置。

那就不好办了

作者: dos时代菜鸟    时间: 2019-3-25 12:09
窄口牛 发表于 2019-3-25 10:47
那个第三方可以,我试了,因为我的bcd路径根本就不是常规的位置,它可以正确判断,但是我现在的精简版系统 ...

第三方软件 是什么?
作者: dos时代菜鸟    时间: 2019-3-25 12:11
2012jiashanni 发表于 2019-3-25 11:23
我用的API

论坛好像有人问过,也有人用 api 编过程序。还有 au3 的

作者: 窄口牛    时间: 2019-3-25 12:29
就应该就是楼上这位程大师的。
作者: dos时代菜鸟    时间: 2019-3-25 12:32
窄口牛 发表于 2019-3-25 12:29
就应该就是楼上这位程大师的。

这个我也关注并下载了。
作者: dos时代菜鸟    时间: 2019-3-25 12:34
窄口牛 发表于 2019-3-25 11:48
找不到,它找不到bcd的正确位置。

如果 新建一个 bcd ,看是否在  {bootmgr} 里有 path 呢?
作者: 窄口牛    时间: 2019-3-25 16:48
默认是有的,要专门删掉才会没有。
作者: 江南一根葱    时间: 2019-3-25 20:59
本帖最后由 江南一根葱 于 2019-3-25 21:01 编辑

@echo off

:: 获取管理员权限运行批处理
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" 1>nul 2>nul
exit /b
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" ) 1>nul 2>nul

find "Detected boot environment: BIOS" C:\Windows\Panther\setupact.log >nul
if errorlevel 1 echo 当前系统工作在UEFI环境 &&pause
if errorlevel 0 echo 当前系统工作在BIOS环境 &&pause

exit


注意区别大小写
不过貌似这个是安装时的启动日志,当前启动应该也可以用这种类似的办法吧
作者: 527104427    时间: 2019-3-25 21:59
江南一根葱 发表于 2019-3-25 20:59
@echo off

:: 获取管理员权限运行批处理


这个文件可以删除的吧?要是被删掉就蛋疼了。

我记得有些清理垃圾的批处理,会把.log清掉的哦。
作者: dos时代菜鸟    时间: 2019-3-26 08:25
本帖最后由 dos时代菜鸟 于 2019-3-26 08:26 编辑

我是发现 bcdedit 会在 uefi 启动模式下 自动给 bcd 的 {bootmgr} 添加 path 值,而在 legacy-bios 模式 就不会,所以,我的思路是将 {bootmgr} 的path 内容保存后删掉,再用 bcdedit /v 看有没有 这个 path 来判断 是什么模式启动的,然后在把 之前保存的 path 恢复回 {bootmgr} 。

只要 bcdedit 能够 正常读取当前 bcd 就可以。但对于那些 bcd 变了位置变了名字的就不行了。

作者: dos时代菜鸟    时间: 2019-3-26 09:29
frg521 发表于 2019-3-25 21:49
...

好的,看来我要研究下了
作者: liuzhaoyzz    时间: 2019-3-26 09:37
本帖最后由 liuzhaoyzz 于 2019-3-27 11:10 编辑

   
1、基于BCDEDIT的方案是不可靠的。一些情况下bcdedit根本就运行不了。
2、基于setupact.log判断的方案是不可靠的,不同系统根本就没有这个文件。
3、检查 HKLM\System\CurrentControlSet\Control\PEFirmwareType 注册表值来查看电脑是启动到 UEFI 模式还是 BIOS 模式,需要运行 wpeutil UpdateBootInfo 来确保该值存在。----这个方案也不靠谱!
4、基于bootice判断的方案是可靠的,pauly大神用的也是windows API,问题是没有命令行的调用方法。
所以,解决方案:
1、2010hook兄给出的方案,这个可以直接批处理调用,不用第三方:(UEFI-WIN7不准确)
@echo off
rem 原理参见2010hook发表在http://bbs.wuyou.net/forum.php?m ... &fromuid=298214
:DetectUEFI
for /f %%a in ('reg query "HKLM\HARDWARE\UEFI\ESRT" /s 2^>nul^|find /i "{"') do set "IsEFI=%%a"
if "!IsEFI:~-1!" equ "}" (
set "loader=efi"
echo UEFI启动
) else (
set "loader=exe"
echo BIOS启动
)
pause

2、windows api调用,里面有源代码和原理。
判断当前系统是BIOS启动还是UEFI启动,是Windows还是PE,内存和磁盘空间情况(by双... - RAMOS - 无忧启动论坛 - Powered by Discuz! http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1

3、批处理搭配adef推荐的detectefi小程序。
@echo off
pushd %~dp0
reg add "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v "DisableUNCCheck" /t "REG_DWORD" /d "1" /f 1>nul 2>nul
rem cd /d "%~dp0"
detectefi |find /i "UEFI" && call :UEFI|| call :BIOS
echo 继续下一句
popd %~dp0
pause
exit /b
pause

:BIOS
echo BIOS启动
pause
exit /b

:UEFI
echo UEFI启动
pause
exit /b
pause



   

作者: adef    时间: 2019-3-26 09:40
网上有小工具,https://github.com/xcat2/xcat-co ... cat/netboot/windows

附件管理员运行。

detectefi.rar (23.66 KB, 下载次数: 35)
作者: adef    时间: 2019-3-26 09:45
liuzhaoyzz 发表于 2019-3-26 09:37
1、基于BCDEDIT的方案是不可靠的。一些情况下bcdedit根本就运行不了。
2、基于setupact.log判断的 ...

方案1貌似有点问题,win7 x64 的 UEFI 启动它判断成 BIOS 启动了。
作者: liuzhaoyzz    时间: 2019-3-26 10:03
本帖最后由 liuzhaoyzz 于 2019-3-26 10:05 编辑
adef 发表于 2019-3-26 09:45
方案1貌似有点问题,win7 x64 的 UEFI 启动它判断成 BIOS 启动了。


    兄弟你说得对,他这个方案,UEFI-WIN7确实判断是错误的,我刚才亲测。UEFI-WIN7下面根本就没有那个主键HKLM\HARDWARE\UEFI,看样子2010hook的方案,还是不靠谱。还是要靠windows api。   
作者: dos时代菜鸟    时间: 2019-3-26 10:28
本帖最后由 dos时代菜鸟 于 2019-3-26 10:38 编辑

说到 api
刚测试 powershell 3.0 有一句 可以成功

  1. (Get-SecureBootuefi -name setupmode)>$nul
  2. $?
复制代码


还有 ,如果用 rundll32.exe 调用 kernel32.dll 中的 GetFirmwareEnvironmentVariableA 函数,句柄应该怎么写?
作者: liuzhaoyzz    时间: 2019-3-26 10:31
dos时代菜鸟 发表于 2019-3-26 10:28
说到 api
刚测试 powershell 3.0 有一句 可以成功

    基于powershell的方案是不可靠的,很多系统早已精简powershell。   
作者: dos时代菜鸟    时间: 2019-3-26 10:39
liuzhaoyzz 发表于 2019-3-26 10:31
基于powershell的方案是不可靠的,很多系统早已精简powershell。

还有 ,如果用 rundll32.exe 调用 kernel32.dll 中的 GetFirmwareEnvironmentVariableA 函数,句柄应该怎么写?
作者: liuzhaoyzz    时间: 2019-3-26 10:57
dos时代菜鸟 发表于 2019-3-26 10:39
还有 ,如果用 rundll32.exe 调用 kernel32.dll 中的 GetFirmwareEnvironmentVariableA 函数,句柄应该怎 ...

   frg521是不是在楼上给出的有例子,我没有试过。     
作者: dos时代菜鸟    时间: 2019-3-26 11:12
liuzhaoyzz 发表于 2019-3-26 10:57
frg521是不是在楼上给出的有例子,我没有试过。

rundll32 kernel32.dll,GetFirmwareEnvironmentVariableA "","{00000000-0000-0000-0000-000000000000}","",0
可以运行但无法取结果

作者: dos时代菜鸟    时间: 2019-3-27 09:04
本课题 脚本解决方案 是 调用 pecmd 加载 kernel32.dll 的 api 句柄
pecmd 脚本内容如下:

  1. CALL $  **c **ret:* C:\windows\system32\Kernel32.dll,GetFirmwareEnvironmentVariableW, mode1,,{00000000-0000-0000-0000-000000000000},,4096
  2. CALL $ **ret:mode1 C:\windows\system32\Kernel32.dll,GetLastError
  3. IFEX $%mode1% = 1 ,ENVI MODE1=BIOS! find $%mode1%=998 ,ENVI MODE1=uefi ! ENVI MODE1=Unknow
  4. MESS %mode1%
复制代码

作者: dos时代菜鸟    时间: 2019-3-27 09:51
frg521 发表于 2019-3-27 09:38
...

主要是 编程序需要编译,所以 第一考虑 用 脚本。


作者: liuzhaoyzz    时间: 2019-3-27 10:58
本帖最后由 liuzhaoyzz 于 2019-3-27 11:06 编辑

    2010hook兄,你说的
Win7不支持UEFI,我的判断结果是对的
,这让我很惊讶。。。这不是强词夺理吗?
    我有个电脑就是UEFI启动的WIN7,Bootice判断正确,bootmode判断正确,detectefi判断正确,就是按你的批处理方案判断错误的。

    另外,个人感觉调用PECMD来判断,我觉得还不如直接用adef推荐的detectefi来判断,我的潜意识里面,更觉得PECMD应该生活在PE里面,正常的windows系统,从文件体积来说,是不是用编译好的成品更好,detectefi只有23KB,这个文件体积可以忽略不计了,PECMD.EXE还有482KB呢,对于正常的windows,也算是个外置命令,个人的爱好吧,权当瞎聊。

作者: dos时代菜鸟    时间: 2019-3-27 11:18
本帖最后由 dos时代菜鸟 于 2019-3-27 11:44 编辑

我这个 win10 ltsc 2019 是通过 legacy 方式安装的,然后 主板支持 uefi 我就 在另一个 gpt 硬盘上弄了个 引导他的 bcd ,用来通过 uefi 引导这个 win10 ,就是为了 研究两种启动方式,这样通过  uefi 启动进入 ltsc2019 确实 注册表中没有 HKLM\HARDWARE\UEFI 这个分支。


另外
detectefi.exe 这个程序 小巧实用,确实不错


我觉得吧,
如果是 pe环境 用一个 pecmd 脚本 应该是最好的,可以嵌入其它 pecmd 脚本
对于 win 10 系统下,用 powershell 一句话就能搞定,win7 就 不知道了。


作者: dos时代菜鸟    时间: 2019-3-27 13:51
把几个 方案 都放到 1楼 了,pecmd 脚本方案 也做了些 改进。
作者: 527104427    时间: 2019-3-31 00:06
frg521 发表于 2019-3-30 23:36
...

你这是干啥,怕出名吗?
作者: dos时代菜鸟    时间: 2019-3-31 23:26
frg521 发表于 2019-3-30 23:36
...

收下,谢谢
作者: dsxmg1990    时间: 2019-4-5 15:52
可以通过diskpart 检测有没有esp分区来测试嘛
作者: Allreal    时间: 2019-4-6 08:59
收下了,谢谢楼主分享成果。
作者: dos时代菜鸟    时间: 2019-4-7 15:19
dsxmg1990 发表于 2019-4-5 15:52
可以通过diskpart 检测有没有esp分区来测试嘛

不准确,uefi 模式下也可以通过 mbr 方式启动,调用 mbr 硬盘上 Fat32 分区上的 efi ,
所谓的 3 启 u 盘 就是这个原理。
作者: liuzhaoyzz    时间: 2019-4-14 23:23
adef 发表于 2019-3-26 09:40
网上有小工具,https://github.com/xcat2/xcat-co ... cat/netboot/windows
...


adef兄,
    你提供的detectefi有问题,只适用于64位系统,这个detectefi.exe是64位VC8.0编写的,因此用于32位系统会出错。这里有个问题:
32位系统下面有UEFI启动吗?结果是有的,虽然32位的UEFI固件很少,问题是:我在32位系统下运行这个64位的detectefi.exe,直接报错,如果在批处理中调用,会影响后面的判断。期待提供32位的detectefi程序。
    直接上图吧。

QQ拼音截图20190414225157.png (7.21 KB, 下载次数: 248)

QQ拼音截图20190414225157.png

作者: adef    时间: 2019-4-15 07:06
liuzhaoyzz 发表于 2019-4-14 23:23
adef兄,
    你提供的detectefi有问题,只适用于64位系统,这个detectefi.exe是64位VC8.0编写的,因 ...

DetectEFIx86.rar (20.84 KB, 下载次数: 31)
作者: liuzhaoyzz    时间: 2019-4-15 08:37
本帖最后由 liuzhaoyzz 于 2019-5-15 19:05 编辑
adef 发表于 2019-4-15 07:06


    感谢!试了下你提供的32位的DetectEFIx86.exe用于32位和64位,我测试了用于64位的UEFI-WIN7 8 10,没问题。32位的只测试了32位的BIOS启动WIN7也没问题,因为没有32位的UEFI固件没法测试。这样说来,64位的detectefi完全没必要存在了,32位的适用性更好! 友请楼主"DOS时代高手" 把他这个DetectEFIx86.exe放到一楼进行替换。
    我编译的bootmode也只编译了32位的版本,用于64位的系统没有问题。bootice也是这样子的,x86版本就可以准确地判断出当前BIOS/UEFI启动模式。   

作者: liuzhaoyzz    时间: 2019-5-15 19:07
本帖最后由 liuzhaoyzz 于 2019-5-15 19:12 编辑
adef 发表于 2019-4-15 07:06


还是要再次麻烦下adef兄弟,你的DetectEFIx86在xp下面根本运行不了啊,提示出错。是怎么回事?vc2008等运行库已经安装过了。
是不支持XP吗?

32M剎p蠰 (17.99 KB, 下载次数: 266)

32M剎p蠰

作者: liuzhaoyzz    时间: 2019-5-18 18:23
标题: 分享
本帖最后由 liuzhaoyzz 于 2019-5-18 18:24 编辑

    求人不如求己啊!我下载了adef兄的https://github.com/xcat2/xcat-co ... cat/netboot/windows源代码,然后用VS2008重新编译,编译的时候选择静态编译,右键项目,属性->配置属性->常规->MFC的使用,选择“在静态库中使用MFC”。编译为32位程序,编译后exe文件52KB,亲测适用于XP,64位的WIN7 10,检测BIOS/UEFI启动模式正确无误。为了区别于adef兄的detectefiX86.exe(45KB),特地改名字为detectefi32.exe(52KB)。现奉上源代码和编译后的exe文件。

   

detectefi32.rar

25.19 KB, 下载次数: 125, 下载积分: 无忧币 -2


作者: xinzaixin    时间: 2020-1-4 22:17
多谢分享,,,,,,,,,,,,,,
作者: qxhdly    时间: 2020-2-11 00:30
多谢分享,,,,,,,,,,,,,,
作者: Anson4    时间: 2020-3-19 14:27
1楼的PECMD代码已经不能适应 Windows 10.0.0.19041,无论是UEFI环境还是LEGACY环境,检测出来的结果都是“1314”,而不是“1”或者“998”。

作者: dos时代菜鸟    时间: 2020-5-7 09:47
Anson4 发表于 2020-3-19 14:27
1楼的PECMD代码已经不能适应 Windows 10.0.0.19041,无论是UEFI环境还是LEGACY环境,检测出来的结果都是“1 ...

特意 弄个 1909 的 win10 测试了下,没问题。
有图有真相。



作者: Anson4    时间: 2020-5-7 22:51
dos时代菜鸟 发表于 2020-5-7 09:47
特意 弄个 1909 的 win10 测试了下,没问题。
有图有真相。

1909的版本号是Windows 10.0.0.18363,2004的版本号才是Windows 10.0.0.19041,其正式版即将到来。
作者: dos时代菜鸟    时间: 2020-5-8 07:01
本帖最后由 dos时代菜鸟 于 2020-5-8 07:08 编辑
Anson4 发表于 2020-5-7 22:51
1909的版本号是Windows 10.0.0.18363,2004的版本号才是Windows 10.0.0.19041,其正式版即将到来。

好吧,好吧,看来 还要等正式的出来了,才能再确定下。
还要看看,那几个 exe 方案能否有效。另外 1314 码 对应的应该是 权限问题,你不妨 用管理员权限 运行 再试试。

作者: Anson4    时间: 2020-5-8 12:29
dos时代菜鸟 发表于 2020-5-8 07:01
好吧,好吧,看来 还要等正式的出来了,才能再确定下。
还要看看,那几个 exe 方案能否有效。另外 1314  ...

已经用了管理员权限了
作者: dos时代菜鸟    时间: 2020-5-9 21:18
Anson4 发表于 2020-5-8 12:29
已经用了管理员权限了

pe 下呢?
作者: Anson4    时间: 2020-5-10 08:27
dos时代菜鸟 发表于 2020-5-9 21:18
pe 下呢?

手上没有2004的PE
不过,我觉得不是权限的问题,因为同样的操作,在1909以及更低版本的系统下运行正常。
作者: Anson4    时间: 2020-7-30 20:40
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?
作者: dos时代菜鸟    时间: 2020-7-31 15:20
Anson4 发表于 2020-7-30 20:40
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?

没用过 那么先进的 系统呀,我这都是老古董。
也不知道 2004 中 dll 调用 句柄是啥。

作者: Anson4    时间: 2020-7-31 16:04
dos时代菜鸟 发表于 2020-7-31 15:20
没用过 那么先进的 系统呀,我这都是老古董。
也不知道 2004 中 dll 调用 句柄是啥。

我的移动CPU一代i5都在用2004,还有啥机器用不了呢?
作者: dos时代菜鸟    时间: 2020-7-31 16:24
Anson4 发表于 2020-7-31 16:04
我的移动CPU一代i5都在用2004,还有啥机器用不了呢?

只能说你还是年轻呀。

我用的是 赛扬 G550 @ 2.60GHz .安装个系统 很费劲,下载个系统也很费劲。
作者: Anson4    时间: 2020-7-31 16:35
dos时代菜鸟 发表于 2020-7-31 16:24
只能说你还是年轻呀。

我用的是 赛扬 G550 @ 2.60GHz .安装个系统 很费劲,下载个系统也很费劲。

G550确实有点老了,不过我的i5-M520也不年轻,性能应该比G550差一些,关键是我装了一块固态硬盘,一般上上论坛还可以。
作者: iteu    时间: 2020-11-22 22:10
多谢分享,,,,,,,,,,,,,,

作者: dos时代菜鸟    时间: 2020-12-15 08:46
Anson4 发表于 2020-7-31 16:35
G550确实有点老了,不过我的i5-M520也不年轻,性能应该比G550差一些,关键是我装了一块固态硬盘,一般上 ...

把 2004 20h4 里的 kernel32.dll 拿来,用一下试试,
或者干脆调用 1809 低版本里的 kernel32.dll 的函数句柄。
作者: dos时代菜鸟    时间: 2020-12-15 09:22
本帖最后由 dos时代菜鸟 于 2020-12-15 11:23 编辑



经测试,特意下载了一个 win10 2004的gho ,用 里面的 kernel32.dll ,通过 python 调用其 相关句柄,能够正常返回 启动类型是 bios 。
效果如图,说明,原有方案是有效的。
如果出现 返回值 1314 的,多半 应该是 权限问题。


奶奶的,下载下来的 居然 是 1903 ,
谁有 2004 的 kernel32.dll 发上来,测试下,、






作者: Anson4    时间: 2020-12-15 20:32
dos时代菜鸟 发表于 2020-12-15 09:22
经测试,特意下载了一个 win10 2004的gho ,用 里面的 kernel32.dll ,通过 python 调用其 相关句柄,能 ...

这个是20H2的,2004的更新版。
kernel32.7z (281.41 KB, 下载次数: 6)

作者: dos时代菜鸟    时间: 2020-12-15 22:39
本帖最后由 dos时代菜鸟 于 2020-12-15 22:41 编辑
Anson4 发表于 2020-12-15 20:32
这个是20H2的,2004的更新版。

确实 不行了,不知道还有 其他 啥好办法没有
在 20h2 中 调用老版本的 kernel32.dll 也不行,显示无法定位 程序输入点。


作者: dos时代菜鸟    时间: 2021-1-14 12:11
Anson4 发表于 2020-7-30 20:40
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?

新版 pecmd 有此功能支持

见1楼。
作者: Anson4    时间: 2021-1-15 16:51
dos时代菜鸟 发表于 2021-1-14 12:11
新版 pecmd 有此功能支持

见1楼。

新版本的PECMD还能这么玩啊,不知道可靠程度如何?
作者: dos时代菜鸟    时间: 2021-1-15 20:08
本帖最后由 dos时代菜鸟 于 2021-1-15 23:07 编辑
Anson4 发表于 2021-1-15 16:51
新版本的PECMD还能这么玩啊,不知道可靠程度如何?

这个应该可以了啦
bootmode.2021.2.7z (1.67 MB, 下载次数: 15)

作者: 2013kyj    时间: 2021-3-2 09:50
本帖最后由 2013kyj 于 2021-3-2 09:54 编辑
liuzhaoyzz 发表于 2019-3-26 09:37
1、基于BCDEDIT的方案是不可靠的。一些情况下bcdedit根本就运行不了。
2、基于setupact.log判断的 ...

关于Windows是否是UEFI启动[不考虑在PE的情况下], 是否可以简单用命令mountvol z: /s来识别呢? MBR的不能加载EFI分区, 批处理应该怎么写呢, 欢迎讨论
作者: liuzhaoyzz    时间: 2021-3-2 10:16
2013kyj 发表于 2021-3-2 09:50
关于Windows是否是UEFI启动[不考虑在PE的情况下], 是否可以简单用命令mountvol z: /s来识别呢? MBR的不能 ...

你的思路不对。
作者: 2013kyj    时间: 2021-3-2 11:07
liuzhaoyzz 发表于 2021-3-2 10:16
你的思路不对。

哦,能否指点一二, 我确实测试过, 能加载就是UEFI, 否则MBR
作者: liuzhaoyzz    时间: 2021-3-2 11:23
2013kyj 发表于 2021-3-2 11:07
哦,能否指点一二, 我确实测试过, 能加载就是UEFI, 否则MBR

判断启动模式,贴自己都已经有了,还要什么?
作者: f2021z    时间: 2021-6-17 18:34
您没有权限
作者: dos时代菜鸟    时间: 2021-6-18 12:32
正确答案在一楼,有更新。
作者: sn4735    时间: 2022-10-6 16:27
感谢楼主的分享




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3