I'm looking for a reliable detection method when I boot into WinPE 4 (powershell) (or WinPE 3 (vbs) as an alternative), did I boot from UEFI or BIOS System? (without starting a third-party exe, as I am in a limited environment)
This significantly changes the way you partition Windows deployments as you change and format partition layouts. (GPT vs MBR, etc.)
I have one job that is an adaptation of this C ++ code in powershell v3, but it looks pretty hack:
## Check if we can get a dummy flag from the UEFI via the Kernel ## [Bool] check the result of the kernel 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() }
It looks pretty simple to get a simple flag.
Does anyone know if there is a better way to do this?
RogerWilco
source share