Как определить (в винде, через WinAPI, может, или ещё как-то) – используется ли UEFI или Lagacy BIOS ?
Есть мысли, что в случае EFI-строения разделов, биос точно -EFI (наоборот, когда разделы MBR, биос не обязательно будет Legacy, т.к. в случае EFI-биоса можно выставить CSM Enable, и грузить по-старому, с MBR). Так вот, строение EFI можно отследить что высокоуровневым образом (на системном диске папка Boot или Sources, в ней .efi файл), что посекторно, прочитав сектор, в котором обычно располагается MBR, в нем в начале будут нули, а не 0x33,0xc0; или заглянуть в конец сектора, там тоже все другое).
Код (Pascal): {$APPTYPE CONSOLE} uses Windows; function GetFirmwareEnvironmentVariable(lpName, lpGuid: PChar; pBuffer: Pointer; nSize: DWORD): DWORD; stdcall; external kernel32 name 'GetFirmwareEnvironmentVariableA'; var Error: DWORD; begin GetFirmwareEnvironmentVariable('', '{00000000-0000-0000-0000-000000000000}', nil, 0); Error := GetLastError; if Error = ERROR_INVALID_FUNCTION then WriteLn('Your system is based on Lagacy BIOS') else if Error = ERROR_NOACCESS then WriteLn('Your system is based on UEFI') else WriteLn('Strange GetLastError (', Error, ')'); ReadLn; end. Спасибо, Pavia
Кстати да, есть несколько способов сделать это гм.. по-современному, https://gallery.technet.microsoft.com/scriptcenter/Determine-UEFI-or-Legacy-7dc79488 а также по дате выпуска Биос, через чОрную консоль или реестр, https://vynesimozg.com/kak-proverit-versiyu-bios-ili-uefi-v-windows-10/
_edge, ну собственно, по первой ссылке делается то же самое (GetFirmwareEnvironmentVariableA), только через PowerShell. А вторую я уже гуглил. Там нет ничего толкового, только посмотреть версию, которая ни о чём не скажет по теме
Хотя, есть ещё GetFirmwareType (в первой ссылке), надо затестить Но это только в Win8+, т.е. её надо грузить через GetProcAddress.
Итого: 1. Код (Pascal): {$APPTYPE CONSOLE} uses Windows; function GetFirmwareEnvironmentVariable(lpName, lpGuid: PChar; pBuffer: Pointer; nSize: DWORD): Longbool; stdcall; external kernel32 name 'GetFirmwareEnvironmentVariableA'; function IsUEFIBasedSystem: Boolean; begin GetFirmwareEnvironmentVariable('', '{00000000-0000-0000-0000-000000000000}', nil, 0); Result := (GetLastError <> ERROR_INVALID_FUNCTION); // else ERROR_NOACCESS end; begin if IsUEFIBasedSystem then WriteLn('Your system is based on UEFI') else WriteLn('Your system is based on Lagacy BIOS'); ReadLn; end. 2. Код (Pascal): {$APPTYPE CONSOLE} uses Windows; type TFirmwareType = (FirmwareTypeUnknown, FirmwareTypeBios, FirmwareTypeUefi, FirmwareTypeMax); TGetFirmwareTypeFunc = function(var FirmwareType: TFirmwareType): Boolean; stdcall; function FirwareType: TFirmwareType; var GetFirmwareType: TGetFirmwareTypeFunc; begin Result := FirmwareTypeUnknown; GetFirmwareType := GetProcAddress(GetModuleHandle(kernel32), 'GetFirmwareType'); // Windows 8 only if @GetFirmwareType <> nil then GetFirmwareType(Result); end; begin case FirwareType of FirmwareTypeUefi: WriteLn('Your system is based on UEFI'); FirmwareTypeBios: WriteLn('Your system is based on Lagacy BIOS') else WriteLn('Unknown firmware type'); // Можно убрать эту строку и заменить FirmwareTypeBios на else end; ReadLn; end.