Хочу прочитать весь Bios (E0000-FFFFF или хотя бы F0000-FFFFF) из-под _любой_ Windows (с 9X/ME всё вроде проще) под _любыми_ правами (в т.ч. юзера). Есть хорошая функция (см. аттач, DumpRomBiosNt), но под юзером она не пашет! Создавать временный Exe-шник и пускать его под эмуляцией ДОСа - это, конечно, вариант, но ИМХО, слишком уж извращённый. Так, как же прочитать Bios из-под NT-шек? Это необходимо для привязки проги к железу. Тут есть 2 варианта: 1. Читать только строки с версиями, серийными номерами, датами и т.д. (документация SMBIOS мне поможет). 2. Читать весь биос, но тогда возникает вопрос: если биос может менять кое-какие данные в самом себе (например, хранить настройки и т.п.), то мы рискуем получать время от времени разные биосы. Собственно, возможно ли такое? Какие адреса 100% неизменяемые? Откуда их лучше читать?
Аттач (Delphi): Код (Text): //////////////////////////////////////////////////////////////////////////////// // // DumpRomBiosNt (rdmPhysical) // // On WinNT the BIOS is accessable through section '\Device\PhysicalMemory'. // This object can only be opened by members of local 'Adminstrators' group. // ZwOpenSection and RtlNtStatusToDosError are documented in newer MSDN/DDK. // type NTSTATUS = Integer; PUnicodeString = ^TUnicodeString; TUnicodeString = packed record Length: Word; MaximumLength: Word; Buffer: PWideChar; end; PObjectAttributes = ^TObjectAttributes; TObjectAttributes = record Length: ULONG; RootDirectory: THandle; ObjectName: PUnicodeString; Attributes: ULONG; SecurityDescriptor: PSecurityDescriptor; SecurityQualityOfService: PSecurityQualityOfService; end; TFNZwOpenSection = function(out Section: THandle; Access: ACCESS_MASK; Attributes: PObjectAttributes): NTSTATUS; stdcall; TFNRtlNtStatusToDosError = function(Status: NTSTATUS): DWORD; stdcall; const PhysMemDevName = '\Device\PhysicalMemory'; PhysMemName: TUnicodeString = (Length: Length(PhysMemDevName) * SizeOf(WideChar); MaximumLength: Length(PhysMemDevName) * SizeOf(WideChar) + SizeOf(WideChar); Buffer: PhysMemDevName; ); PhysMemMask: ACCESS_MASK = SECTION_MAP_READ; PhysMemAttr: TObjectAttributes = (Length: SizeOf(TObjectAttributes); RootDirectory: 0; ObjectName: @PhysMemName; Attributes: $00000040; // OBJ_CASE_INSENSITIVE SecurityDescriptor: nil; SecurityQualityOfService: nil; ); var ZwOpenSection: TFNZwOpenSection; RtlNtStatusToDosError: TFNRtlNtStatusToDosError; function DumpRomBiosNt(RomBase: Pointer; RomSize: Cardinal; var Dump): Boolean; var HMod: HMODULE; Stat: NTSTATUS; Sect: THandle; View: Pointer; begin Result := False; HMod := GetModuleHandle('ntdll.dll'); if HMod = 0 then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else begin if not Assigned(ZwOpenSection) then ZwOpenSection := GetProcAddress(HMod, 'ZwOpenSection'); if not Assigned(RtlNtStatusToDosError) then RtlNtStatusToDosError := GetProcAddress(HMod, 'RtlNtStatusToDosError'); if not Assigned(ZwOpenSection) or not Assigned(RtlNtStatusToDosError) then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else begin Stat := ZwOpenSection(Sect, PhysMemMask, @PhysMemAttr); if Stat >= 0 then try View := MapViewOfFile(Sect, PhysMemMask, 0, Cardinal(RomBase), RomSize); if View <> nil then try Move(View^, Dump, RomSize); Result := True; finally UnmapViewOfFile(View); end; finally CloseHandle(Sect); end else SetLastError(RtlNtStatusToDosError(Stat)); end; end; end;
http://wasm.ru/forum/viewtopic.php?pid=277858#p277858 не знаю на сколько правда (не проверял) 1) Чтение строковых данных из SMBIOS можно глянуть во всяких прожках-информатерах по железу компа. Да и там можно подцепить только даты,версии,модели , а операться на наличие и уникальность серийников вообще не стоит (могут меняться после прошивки). 2) Там полно данных, которые могут меняться.
Ну это то же самое по сути (ссылка). Только под юзером ZwOpenSection не работает Вот через WMI читать отдельные характеристики - это можно. А по SMBIOS у меня спецификация есть
Видимо, оптимальный вариант - это WMI, ZwOpenSection(\Device\PhysicalMemory), на край делать Exe-шник и запускать его, а уж совсем на край - читать реестр. А под 9X/ME читать напрямую. Кстати, а какой-нибудь 16-битный dll можно сделать, чтоб из-под XP его подключить можно было (и читать из него BIOS)? Ну а что-то есть, что меняться не может.
Настройки БИОС хранит не в самом себе : сам БИОС, если его не перешивают - неизменен. Другое дело, что и в ДОС и Винде сидит "копия" из флешки в память, и менятся ли она - я не знаю.
А может, кто-то другой знает? Прикол в том, что SMBIOS содержит информацию о процессоре, которая явно записывается самим биосом... Где ж взять исходный неизменяемый биос?
А кто вам сказал, что она пишется в флешку ? Есть так называемая "расширенная память БИОС". Туда все и пишется. Возможно сейчас еще куда-то - на шине PCI тьма памяти.
Да это понятно, что пишется не в БИОС, но когда я читаю F0000-FFFFF, получаю именно расширенку. А откуда читать оригинал, так сказать? p.s. Слышал про FFFF0000-FFFFFFFF. Что там?
Сейчас через WinHex прочитал физическую память F0000-FFFFF. Там BIOS и он естественно попал туда из флешки. Память FFFF0000-FFFFFFFF виртуальная. Значит ее содержимое определяет ОС и БИОС тут не при чем, хотя где-то читал что там копия БИОС. Теперь про оригинал. Что ты под этим подразумеваешь? Дело в том, что в старых компах БИОС просто отображался в память и все. В новых БИОС упакован и распаковывается в память, т.ч. оригинал - это неопределенно. А так как БИОС в памяти, то никто не мешает писать туда и самому БИОС-у и ОС. Советую посетить rom.by - там БИОС-ом давно уже занимаются.