Я ищу способ надежно определить, когда я загружаюсь в WinPE 4 (powershell) (или WinPE 3 (vbs) в качестве альтернативы), загрузился ли я из системы UEFI или BIOS? (без запуска стороннего исполняемого файла, поскольку я нахожусь в ограниченной среде)
Это значительно меняет способ разделения развертывания Windows по мере изменения макета и формата разделов. (GPT против MBR и т. д.)
У меня есть работающая адаптация этого 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()
}
Это кажется слишком чрезмерным только для того, чтобы получить простой флаг.
Кто-нибудь знает, есть ли лучший способ сделать это?