Запись в видеопамять

Тема в разделе "WASM.NT.KERNEL", создана пользователем murder, 3 июн 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Отнюдь, он в два раза больше. Посмотри определение PHYSICAL_ADDRESS в DDK.
    Ты имеешь в виду виртуальный адрес, который получишь? В винде FLAT-модель, поэтому тебе не нужно создавать никаких дополнительных сегментов, а достаточно заюзать любой из имеющихся у тебя селекторов (ss,cs,es,ds), кроме FS, т.к. они все имеют базу 0 и лимит FFFFFFFF.
    Насколько я понимаю, MmMapIoSpace создает в таблице страниц твоего процесса (правда, в системной части, которая разделяется между всеми процессами, так что этот адрес будет валидным в контексте любого процесса системы) отображение физических страниц видеобуфера и возвращает тебе соответствующий виртуальный адрес в плоской модели памяти винды, который будет действителен относительно любого селектора (кроме FS, у него база не 0).
    В доказательство цитата из MSDN:
    Это по поводу предпоследнего твоего сообщения. Насчет последнего - я хз, про видеобуфера и их особенности я не в курсе.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    murder
    DrvGetDirectDrawInfo - возвращает адрес начала и конца видео памяти. - Сам я не пробовал.

    Можно еще через порты ввода/вывода. Найти через PCI видео карту считать ее BAR регистры в них записаны эти адреса и проверить на установку бит 3-Prefetchable. У регистров отображенных в память данный бит должен быть снят, а у самой видео памяти выставлен. Судя по спецификации PCI данный способ универсальный.
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Pavia
    Короче в спецификации VESA 2.0 есть функция для получения информации о видеорежиме, а втом числе и о начале видеопамяти. Проверял в Pascal`е - всё работает. Как вызвать RM прерывание 10h из защищенного режима?

    Сейчас поищу инфу о DrvGetDirectDrawInfo, может что-нибудь получится.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    никак
     
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Pavia
    Блин, для вызова DrvGetDirectDrawInfo нужно вызвать DrvEnablePDEV и создать кучу структур. Наверное лучше через порты.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    могу посоветовать прочитать про VBE >= 2.0
    вроде в нем предусмотрен интерфейс защищенного режима
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    murder
    Я ядро виндоуса плохо знаю. Вот вроде наше то что тебе нужно IOCTL_VIDEO_MAP_VIDEO_MEMORY. От мэпирует память, куда надо и вернет ее размеры.
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Что ещё за запрос минидрайвера?

     
  9. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Вот пример, когдато делал...
    Может поможет )
    Отсутствие кривости не гарантирую, может и БСОД-нуть, но у меня на 4-х компах работало нормально
     
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Bohdan200
    Спс. посмотрим.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    murder
    хе, там как раз используется MmMapIoSpace
     
  12. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Вот если кому интересно перевёл с английского:

    Работа с VESA в защищённом режиме (официальное руководство)

    1. В первых 32 килобайтах памяти с адресом 0C0000h найти структуру

    PMInfoBlock struc
    Signature db 'PMID' ; PM Info Block Signature
    EntryPoint dw ? ; Offset of PM entry point within BIOS
    PMInitialize dw ? ; Offset of PM initialization entry point
    BIOSDataSel dw 0 ; Selector to BIOS data area emulation block
    A0000Sel dw A000h ; Selector to access A0000h physical mem
    B0000Sel dw B000h ; Selector to access B0000h physical mem
    B8000Sel dw B800h ; Selector to access B8000h physical mem
    CodeSegSel dw C000h ; Selector to access code segment as data
    InProtectMode db 0 ; Set to 1 when in protected mode
    Checksum db ? ; Checksum byte for structure
    PMInfoBlock ends

    Отличительным признаком является сигнатура 'PMID'. Сумма всех байтов должна быть равна 0.
    2. Выделить 600h байт памяти и поместить селектор на неё в BIOSDataSel. Память должна быть пустой, селектор - для данных (чтение/запись).
    3. Создать селекторы для 0A0000h, 0B0000h, 0B8000h и поместить их в соответствующие поля (селекторы для данных 64,64 и 32 килобайт соответственно)
    4. Создать селектор на 0C0000h (32 килобайта, чтение/запись, данные) и поместить в CodeSegSel
    5. Установить InProtectMode в 1.
    6. Выделить 1024 байта памяти и создать селектор на неё (для стека). Теперь перед вызовом функций VESA нужно помещать этот селектор в SS и обнулять ESP.
    7. Создать селектор на 0C0000h (теперь уже для кода). Вызвать через этот селектор и смещение PMInitialize функцию инициализации. Теперь можно вызывать функции через всё тот же селектор и смещение EntryPoint. Это ничем не отличается от int 10h в RM.

    ОЧЕНЬ ВАЖНЫЙ МОМЕНТ!
    В официальной доке к BIOS`у обращаются не напрямую, а для начала КОПИРУЮТ ЕГО В ПАМЯТЬ. Но т.к. Практически у всех включена опция затенения видео биоса, то он и так должен находиться в RAM (то есть 0C0000h должен указывать на оперативную память). Хотя я НЕ ПРОВЕРЯЛ.

    Вобщем попробую с VESA (это позволит получить исчерпывающую информацию и можно будет изменить видеорежим). Если не получится то через DrvGetDirectDrawInfo - в исходнике на мой взгляд задействуется слишком ного функций.
     
  13. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    пытаюсь вызвать функцию инициализации по селектору в gs и смещению в edi.

    call addr gs:[edi+5]

    MASM пишет, что "error A2008: syntax error : addr"
    addr для того, чтобы он воспринял адрес как указатель на функцию, а не указатель на указатель на функцию.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    так не бывает
     
  15. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Ну не работал я раньше с MASM`ом. Вот в NASM или FASM есть модификаторы (short, near, far) для переходов. А как это сделать в MASM?

    Я бы кодил в FASM`е, но простейшая команда типа
    mov [qwerty],eax
    приводит к крэшу (с кодом 7Eh по-мойму).

    Я сравнивал в дизассемблере *.sys файлы от MASM и от FASM: код идентичный (правда в FASM гораздо лучше сделан invoke). В PE заголовке FASM заполняет не все поля (адреса кода,данных, размер выгружаемого кода всегда равны 0) и версия ОС - 3.1.

    Вот, что интересно
    call next
    dw 0
    next:
    pop edi
    mov word [edi],1
    Работает нормально!
     
  16. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Как сделать CALL с 6-байтовым операндом в памяти?

    call far ptr operand не работает т.к.

     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А нафиг указывать far тогда? :)
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. mov eax, <address>
    2. db 0xFF, 0x18
    или
    Код (Text):
    1. db 0xFF, 0x1D
    2. dd <address>
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    call fword ptr [eax]
     
  20. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Great, rei3er
    Спасибо, что ответили на этот ламерский вопрос. У меня была только дока для MASM (не MASM32).

    Теперь буду пытаться работать с VBE...