Я ищу способ, чтобы надежно обнаружить при загрузке в WinPE 4 (Powershell) (или WinPE 3 (VBS) в качестве альтернативного), я загрузился с UEFI или BIOS системы? (без запуска ехе третьей стороны, как я нахожусь в ограниченной среде)Как определить, загрузилась ли WinPE (4) из UEFI или BIOS?
Это существенно меняет, как я бы секционирования развертывания окна, как изменения разделов макета и формата. (GPT против MBR и т.д.)
У меня есть один рабочий, который является адаптацией this C++ кода в Powershell v3, но он чувствует себя довольно взломать иш:
## Check if we can get a dummy flag from the UEFI via the Kernel
## [Bool] check the result of the kernel's fetch of the dummy GUID from UEFI
## The only way I found to do it was using the C++ compiler in powershell
Function Compile-UEFIDectectionClass{
$win32UEFICode= @'
using System;
using System.Runtime.InteropServices;
public class UEFI
{
[DllImport("kernel32.dll")]
public static extern UInt32 GetFirmwareEnvironmentVariableA([MarshalAs(UnmanagedType.LPWStr)] string lpName, [MarshalAs(UnmanagedType.LPWStr)] string lpGuid, IntPtr pBuffer, UInt32 nSize);
public static UInt32 Detect()
{
return GetFirmwareEnvironmentVariableA("", "{00000000-0000-0000-0000-000000000000}", IntPtr.Zero, 0);
}
}
'@
Add-Type $win32UEFICode
}
## A Function added just to check if the assembly for
## UEFI is loaded as is the name of the class above in C++.
Function Check-IsUEFIClassLoaded{
return ([System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes()} | ? {$_.FullName -eq "UEFI"}).Count
}
## Just incase someone was to call my code without running the Compiled code run first
If (!(Check-IsUEFIClassLoaded)){
Compile-UEFIDectectionClass
}
## The meat of the checking.
## Returns 0 or 1 ([BOOL] if UEFI or not)
Function Get-UEFI{
return [UEFI]::Detect()
}
Это кажется довольно поверх всего чтобы получить простой флаг.
Кто-нибудь знает, есть ли лучший способ сделать это?
не следует ли я в WinPE, чтобы начать с. Когда я нахожусь в PE, я был загружен UEFI или Legacy BIOS. – RogerWilco