UEFI или Lagacy BIOS ?

Тема в разделе "WASM.WIN32", создана пользователем Jin X, 28 июн 2018.

  1. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Как определить (в винде, через WinAPI, может, или ещё как-то) – используется ли UEFI или Lagacy BIOS ?
     
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Есть мысли, что в случае EFI-строения разделов, биос точно -EFI (наоборот, когда разделы MBR, биос не обязательно будет Legacy, т.к. в случае EFI-биоса можно выставить CSM Enable, и грузить по-старому, с MBR).

    Так вот, строение EFI можно отследить что высокоуровневым образом (на системном диске папка Boot или Sources, в ней .efi файл), что посекторно, прочитав сектор, в котором обычно располагается MBR, в нем в начале будут нули, а не 0x33,0xc0; или заглянуть в конец сектора, там тоже все другое).
     
    Mikl___ нравится это.
  3. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Код (Pascal):
    1. {$APPTYPE CONSOLE}
    2. uses Windows;
    3. function GetFirmwareEnvironmentVariable(lpName, lpGuid: PChar; pBuffer: Pointer; nSize: DWORD): DWORD; stdcall; external kernel32 name 'GetFirmwareEnvironmentVariableA';
    4. var Error: DWORD;
    5. begin
    6.   GetFirmwareEnvironmentVariable('', '{00000000-0000-0000-0000-000000000000}', nil, 0);
    7.   Error := GetLastError;
    8.   if Error = ERROR_INVALID_FUNCTION then WriteLn('Your system is based on Lagacy BIOS')
    9.   else if Error = ERROR_NOACCESS then WriteLn('Your system is based on UEFI')
    10.   else WriteLn('Strange GetLastError (', Error, ')');
    11.   ReadLn;
    12. end.
    Спасибо, Pavia :)
     
    _edge нравится это.
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Jin X нравится это.
  5. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    _edge, ну собственно, по первой ссылке делается то же самое (GetFirmwareEnvironmentVariableA), только через PowerShell.
    А вторую я уже гуглил. Там нет ничего толкового, только посмотреть версию, которая ни о чём не скажет по теме :)
     
  6. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Хотя, есть ещё GetFirmwareType (в первой ссылке), надо затестить :)
    Но это только в Win8+, т.е. её надо грузить через GetProcAddress.
     
  7. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Итого:

    1.
    Код (Pascal):
    1. {$APPTYPE CONSOLE}
    2. uses Windows;
    3.  
    4. function GetFirmwareEnvironmentVariable(lpName, lpGuid: PChar; pBuffer: Pointer; nSize: DWORD): Longbool; stdcall; external kernel32 name 'GetFirmwareEnvironmentVariableA';
    5.  
    6. function IsUEFIBasedSystem: Boolean;
    7. begin
    8.   GetFirmwareEnvironmentVariable('', '{00000000-0000-0000-0000-000000000000}', nil, 0);
    9.   Result := (GetLastError <> ERROR_INVALID_FUNCTION);  // else ERROR_NOACCESS
    10. end;
    11.  
    12. begin
    13.   if IsUEFIBasedSystem then WriteLn('Your system is based on UEFI')
    14.   else WriteLn('Your system is based on Lagacy BIOS');
    15.   ReadLn;
    16. end.
    2.
    Код (Pascal):
    1. {$APPTYPE CONSOLE}
    2. uses Windows;
    3.  
    4. type
    5.   TFirmwareType = (FirmwareTypeUnknown, FirmwareTypeBios, FirmwareTypeUefi, FirmwareTypeMax);
    6.   TGetFirmwareTypeFunc = function(var FirmwareType: TFirmwareType): Boolean; stdcall;
    7.  
    8. function FirwareType: TFirmwareType;
    9. var GetFirmwareType: TGetFirmwareTypeFunc;
    10. begin
    11.   Result := FirmwareTypeUnknown;
    12.   GetFirmwareType := GetProcAddress(GetModuleHandle(kernel32), 'GetFirmwareType');  // Windows 8 only
    13.   if @GetFirmwareType <> nil then GetFirmwareType(Result);
    14. end;
    15.  
    16. begin
    17.   case FirwareType of
    18.     FirmwareTypeUefi: WriteLn('Your system is based on UEFI');
    19.     FirmwareTypeBios: WriteLn('Your system is based on Lagacy BIOS')
    20.     else WriteLn('Unknown firmware type');  // Можно убрать эту строку и заменить FirmwareTypeBios на else
    21.   end;
    22.   ReadLn;
    23. end.