Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2018, 12:34   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Читаем rom файл BIOS

Привет, подскажите как прочитать файл *.rom из биоса видео карты.
пробую делать так:

Код:
var
 Buffer: PansiChar;
  Stream: TFileStream;
  Size:   LongInt;
  I: Integer;
begin
Stream := TFileStream.Create(edtBIOSMod.Text, fmOpenRead);
  try
    Size := Stream.Size;
    GetMem(Buffer, Size);
    try
    for I := 0 to 512 do
      begin
      Stream.ReadData(Buffer, i);
      memo1.Lines.Add(buffer);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    Stream.Free;
  end;
end;
но в мемо приходит что то странное



U
Єt
й©







520


:10
Г
*E бЂ~

*я




xx
S
ING-8GD/F5/0438



8-2010, Advanced Micro Devic
es, Inc.
5.050.000.000.000000
F5
GBT_ELLESMERE_D00901_A1_GD5_8GB_
DI1DVDFAN\config.h
Иqт
g


Ј:Њ.І и*. Аuў
и¶/иЃ-2Т‰<Ў:fБАЎ.ии(ири^иUи{
*чEP
Љг°fP»
[fZfYfXЛ.‹.ѓ>Я
рЗ@
ЁЉ[‰Є.ЋЭ‹ГЈЊ[Јњ[Ј®[ќГPMIDт°H
А
и?CлизJлґи©.ПиЂ.и)uи%
uиhCли·Jлґиy.ЛfPfQfRfSfUfVfW <u#»
6Љ<Ђп0і‹м‰^ ‰FfБи‰F
и‰Fй€<u9иsfСа‹м‰F»
и'3Аf‰F
из„й#<u!иrtиe
иЗи“иѕ3ЙfБи
и‹м‰Nйю

яuиЈ‹м‰F fБи‰FиD‰NйЮ
,f А„¶
йЌ
FлWиCtBлP<ЋuЂяtЂяu2ЂБиЛл:<Џ u&Ђяuил,Ђяu
и!
‹м€^ лЂя…uииъл‹мЖFл‹мЖFл2д‹м €ff_f^f]f[fZfYf
XГQЉИё
иїГ
а жaЉД№И
юД€&!
А[Ги&(»


§YuниЋ 3ИлжfБоГЁuZиАfБж3ци[
t$и+
t и° $<uнл
иҐ Ёtдиий

tµии_&юБ8Бrл3циЭ t&и" ию"uиг
Ыt
иЁи~µ
иЫ$Гиs3Й3Ти¶f3Тf3АиC иS
АГиО и0f3Аfє


как и во что это переводить? почему часть информации читабельна, а часть нет?
PTyTb32 вне форума Ответить с цитированием
Старый 11.03.2018, 12:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Оо... с такими познаниями лезть к биос-файлам. Просвещайтесь https://ru.wikipedia.org/wiki/%D0%94...B0%D0%B9%D0%BB
p51x вне форума Ответить с цитированием
Старый 11.03.2018, 12:40   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Оо... с такими познаниями лезть к биос-файлам. Просвещайтесь https://ru.wikipedia.org/wiki/%D0%94...B0%D0%B9%D0%BB
по сути мне от туда нужно лишь несколько значений, фактическим изменением таких файлов будет заниматься Polaris BIOS Editor, а я хочу отображать основную информацию из этого файла, а за ссылку спасибо)
PTyTb32 вне форума Ответить с цитированием
Старый 11.03.2018, 12:55   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Тогда берите доку, описывающий формат конкретного биоса - разбирайте и распаковывайте его, а потом уже из нужного файла вытаскивайте нужные вам значения.
p51x вне форума Ответить с цитированием
Старый 11.03.2018, 13:30   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Еще в OpenGL есть функции которые дают кое какую информацию о видео карте
Код:
  showmessage(glGetString(GL_VENDOR));
  showmessage(glGetString(GL_RENDERER));
  showmessage(glGetString(GL_VERSION));
  showmessage(glGetString(GL_EXTENSIONS));
И так далее поищите инфу на эту тему glGetString в интернете.
Может это вам поможет чтобы не лесть в дебри)

Последний раз редактировалось Aliens_wolfs; 11.03.2018 в 13:34.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.03.2018, 13:38   #6
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Еще в OpenGL есть функции которые дают кое какую информацию о видео карте
Код:
  showmessage(glGetString(GL_VENDOR));
  showmessage(glGetString(GL_RENDERER));
  showmessage(glGetString(GL_VERSION));
  showmessage(glGetString(GL_EXTENSIONS));
И так далее поищите инфу на эту тему glGetString в интернете.
Может это вам поможет чтобы не лесть в дебри)
OpenCL еще не использовал, задумка в том что бы знать что за биос нужен для видео карты, то есть хочу показывать вот эти параметры
Снимок.JPG
что бы при скачивании какого то модифицированного биоса сравнить их с родными (на сколько я понял если они не совпадут, то велик шанс получить из карты кирпич)
PTyTb32 вне форума Ответить с цитированием
Старый 11.03.2018, 13:42   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Тогда делайте как посоветовал вам p51x

В общем изучайте формат конкретного биоса, а затем из нужных заголовков прочитанных из данного формата извлекайте нужную инфу

Последний раз редактировалось Aliens_wolfs; 11.03.2018 в 13:54.
Aliens_wolfs вне форума Ответить с цитированием
Старый 12.03.2018, 01:45   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

По основам Паскаля/Дельфи добавлю замечание по коду.
Чтение в буфер должно выглядеть так
Код:
Stream.ReadData(Buffer[0], i);
northener вне форума Ответить с цитированием
Старый 14.03.2018, 20:48   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
подскажите как прочитать файл *.rom из биоса видео карты.
БИОС плат расширения копируются в диапазон системной памяти С000:0000--D000:FFFFh.
Каждое/загрузочное устройство (в т.ч. и видео) имеет сигнатуру 55AAh.
Системный БИОС сканит память 2-Кбайтными блоками:
Код:
C:\>debug
-d C000:0
            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
           ------------------------------------------------------------------
C000:0000  55 AA 72 EB 4B 37 34 30-30 E9 4C 19 77 CC 56 49   U.r.K7400.L.w.VI
C000:0010  44 45 4F 20 0D 00 00 00-F0 01 3A 1D 00 00 49 42   DEO ......:...IB
C000:0020  4D 20 56 47 41 20 43 6F-6D 70 61 74 69 62 6C 65   M VGA Compatible
C000:0030  01 00 00 00 D0 00 24 BD-30 39 2F 30 38 2F 30 38   ......$.09/08/08
C000:0040  00 00 00 00 00 00 00 00-00 10 00 00 00 00 00 00   ................
-----------------------
Первой всегда идёт ROM-BIOS видеокарты. Формат данных имеет свой стандарт:
Код:
Offset | Size  |   Name
-------|-------|--------------------------------------
0        2        Magic: 55AAh - сигнатура
2        1        ROM-size - размер кода BIOS в 512-байтных единицах
3        2        jmp-short Init - на функцию инициализации
5        ......   Данные производителя
18       2        PCI-Struct-offset (PCIR) - на структуру данных PCI
1A       2        PnP-Struct-offset ($PnP) - на структуру данных PnP
Здесь интересно слово, по смещению [0x18] - PCI-Struct-offset,
которое отправляет нас по адресу [0x01F0] (у слов - байты меняются).
Код:
-d C000:01F0
            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
           ------------------------------------------------------------------
C000:01F0  50 43 49 52 DE 10 E6 06-00 00 18 00 00 00 00 03   PCIR............
C000:0200  72 00 01 00 00 80 00 00-50 59 48 24 FF B8 42 49   r.......PYH$..BI
C000:0210  54 00 00 01 0C 06 12 45-32 01 04 00 94 02 42 02   T......E2.....B.
C000:0220  1C 00 98 02 43 01 0E 00-B4 02 44 01 04 00 C2 02   ....C.....D.....
..угу, и точно PCIR. Здесь тоже всё по-плану:
Код:
Структура PCIR
----------------
0        4        Сигнатура 'PCIR' - 50 43 49 52
4        2        Vendor-ID - производитель
6        2        Device-ID - устройство
8        2        Offset VPD (Vendor Porduct Data) - адрес данных о продукте
А        2        PCI structure len - длина структуры данных (18h)
C        1        PCI structure rev - дата изменения структуры
D        3        Class-Code - код класса
10       2        Image len - длина образа в блоках по 512-байт
12       2        REV Level - ревизия
14       1        Code Type - тип кода
15       1        Space Indicator - признак: MEM=0, I/O=1
16       ...      - Резерв..
-----------------------------------------------------------------
После сигнатуры 'PCIR' идёт сразу вендор[10DE], и девис[06E6] идентификаторы.
Имеются спец/базы, внутри которых прописана расшифровка кодов (база в скрепке)...
Поиск в ней тыкает носом в карту: [0x10DE, 0x06E6, "G100", "nVidia G100"]
Именно такая карта у меня установлена...

Код на асме (без скана базы) для поиска устройств выглядит так (можешь переделать на Дельфи):
Код:
;FASM-code
;------------
org   100h
jmp   start

mess0   db  13,10,'Scan ROM-MODULE... '
        db  13,10,'Found.: $'
vid     db  13,10,'-------------------'
        db  13,10,'Vendor ID: $'
did     db  13,10,'Device ID: $'

start:
;####################################################################
; Поиск дополнительной ROM в области памяти C000->E000 в блоках по 2K
; Модуль ROM должен иметь подпись '55AA' в первых двух байтах и
; индикатор размера (размер в байтах/512) в третьем байте.
; Исполняемый код должен начинаться с байта(4).
;####################################################################

        mov    dx,0C000h      ; начало сканирования
        xor    cx,cx          ; кол-во найденых - сначала нуль
@rom_scan:
        mov    es,dx          ; DS = сегмент очередного ROM-модуля
        xor    di,di          ; DI = указатель в ROM-модуле
        cmp    word[es:di],0AA55h     ; сигнатура найдена?
        jnz    @next          ; нет - перейти к сл.адресу ROM
        push   es             ; иначе: запоминаем адрес
        inc    cx             ; счётчик найденых +1
@next:  add    dx,80h         ; новый модуль через 2-Kбайт...
        cmp    dx,0E000H      ; достигнут адрес E0000?
        jl     @rom_scan      ; нет - продолжить..

        mov    dx,mess0       ;
        call   Message        ;
        mov    ax,cx          ;
        add    al,30h         ; кол-во найденых
        int    29h            ;

@cycle: pop    es             ;
        mov    dx,vid         ;
        call   Message           ;
        mov    bx,word[es:18h]   ; PCI-Struct-offset
        add    bx,4              ;
        mov    ax,word[es:bx]    ; Vendor
        call   hexOut            ;

        mov    dx,did            ;
        call   Message           ;
        mov    ax,word[es:bx+2]  ; Device
        call   hexOut            ;
        loop   @cycle            ;

        xor    ax,ax
        int    16h
        int    20h
;------------8<----- КОНЕЦ КОДА --------8<------------
Message:  ;<----------; Функция вывода сообщений
        mov    ah,9
        int    21h
ret
;-------
hexOut:   ;<----------; Функция вывода числа(АХ) на экран
        pusha
        xchg   dx,ax
        mov    cx,4
@@:     shld   ax,dx,4
        rol    dx,4
        and    al,0Fh
        cmp    al,0Ah
        sbb    al,69h
        das
        int    29h
        loop   @b
        popa
        ret
Изображения
Тип файла: gif rom.gif (3.6 Кб, 131 просмотров)
Вложения
Тип файла: zip pci_header.zip (136.3 Кб, 13 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 06.09.2018, 18:06   #10
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
БИОС плат расширения копируются в диапазон системной памяти С000:0000--D000:FFFFh.
спасибо! теперь на много понятнее как это работает, и куда копать)
PTyTb32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как считать ROM BIOS? FaTaL Общие вопросы Delphi 5 06.02.2012 14:33
как к BIOS обращаться. Нужно чтение/запись BIOS. Dethon_ASM_Scarel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 26.10.2011 11:40
как в BIOS версии V1.0, Тип AMI, CD-ROM поставить в приоритете wowan.mix Компьютерное железо 6 24.02.2010 19:21
Буква CD-ROM’a Micha Компоненты Delphi 5 05.10.2007 11:36