Отнюдь, он в два раза больше. Посмотри определение PHYSICAL_ADDRESS в DDK. Ты имеешь в виду виртуальный адрес, который получишь? В винде FLAT-модель, поэтому тебе не нужно создавать никаких дополнительных сегментов, а достаточно заюзать любой из имеющихся у тебя селекторов (ss,cs,es,ds), кроме FS, т.к. они все имеют базу 0 и лимит FFFFFFFF. Насколько я понимаю, MmMapIoSpace создает в таблице страниц твоего процесса (правда, в системной части, которая разделяется между всеми процессами, так что этот адрес будет валидным в контексте любого процесса системы) отображение физических страниц видеобуфера и возвращает тебе соответствующий виртуальный адрес в плоской модели памяти винды, который будет действителен относительно любого селектора (кроме FS, у него база не 0). В доказательство цитата из MSDN: Это по поводу предпоследнего твоего сообщения. Насчет последнего - я хз, про видеобуфера и их особенности я не в курсе.
murder DrvGetDirectDrawInfo - возвращает адрес начала и конца видео памяти. - Сам я не пробовал. Можно еще через порты ввода/вывода. Найти через PCI видео карту считать ее BAR регистры в них записаны эти адреса и проверить на установку бит 3-Prefetchable. У регистров отображенных в память данный бит должен быть снят, а у самой видео памяти выставлен. Судя по спецификации PCI данный способ универсальный.
Pavia Короче в спецификации VESA 2.0 есть функция для получения информации о видеорежиме, а втом числе и о начале видеопамяти. Проверял в Pascal`е - всё работает. Как вызвать RM прерывание 10h из защищенного режима? Сейчас поищу инфу о DrvGetDirectDrawInfo, может что-нибудь получится.
Pavia Блин, для вызова DrvGetDirectDrawInfo нужно вызвать DrvEnablePDEV и создать кучу структур. Наверное лучше через порты.
murder Я ядро виндоуса плохо знаю. Вот вроде наше то что тебе нужно IOCTL_VIDEO_MAP_VIDEO_MEMORY. От мэпирует память, куда надо и вернет ее размеры.
Вот пример, когдато делал... Может поможет ) Отсутствие кривости не гарантирую, может и БСОД-нуть, но у меня на 4-х компах работало нормально
Вот если кому интересно перевёл с английского: Работа с 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 - в исходнике на мой взгляд задействуется слишком ного функций.
пытаюсь вызвать функцию инициализации по селектору в gs и смещению в edi. call addr gs:[edi+5] MASM пишет, что "error A2008: syntax error : addr" addr для того, чтобы он воспринял адрес как указатель на функцию, а не указатель на указатель на функцию.
Ну не работал я раньше с 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 Работает нормально!
Great, rei3er Спасибо, что ответили на этот ламерский вопрос. У меня была только дока для MASM (не MASM32). Теперь буду пытаться работать с VBE...