Сейчас на форуме: tyns777 (+5 невидимых) |
eXeL@B —› Программирование —› Вывод на экран из драйвера |
Посл.ответ | Сообщение |
|
Создано: 30 июля 2007 01:38 · Личное сообщение · #1 Последний месяц волнует тема как вывести инфу на экран из драйвера. Вот что имею: 1) Если покопаться в PCI конфигурационной области видеокарты, то там можно найти базовый физический адрес видеопамяти, далее его мепируем и при записи в мепируемую память можно рисовать на экране. Вот все хорошо было, но появилась GeForce 8800 и теперь вместо вывода полинейно (т.е. последовательной записи в видеопамять), строка за строкой от начала frame buffer изображение выводится в виде прямоугольников разного размера и в различных учасках экрана. 2) Ладно думаю я тогда можно посмотреть как DirectDraw получает доступ к frame buffer. Выяснил что драйверу минипорта посылается IOCTL_VIDEO_SHARE_VIDEO_MEMORY (это под виртуалкой VmWare), который и возращает указатель на frame buffer. Только вот загвостка если под виртуалкой все работает на ура, то на GeForce 8800 опять "прямоугольники". При трасировке запросов к драйверу минипорта GeForce выяснилось что на него поступают запросы с IOCTL 80052000h и др., а инициатор запосов видеодрайвер nv4_disp.dll. Т.о. поскольку данные IOCTL недокументированы я зашел в тупик, как же все-таки вывести из ядра на экран (попутно запрос IOCTL_VIDEO_MAP_VIDEO_MEMORY действительно мепирует видеопамять, но только под виртуалкой, а на машине с GeForce 8800 при обращении к этой памяти возникает исключение - отсутствие страницы в памяти) Поделитесь пожалуйста своими соображаниями как можно вывести на экран из режима ядра? |
|
Создано: 31 июля 2007 00:38 · Личное сообщение · #2 |
|
Создано: 31 июля 2007 07:01 · Личное сообщение · #3 |
|
Создано: 02 августа 2007 02:52 · Личное сообщение · #4 |
|
Создано: 02 августа 2007 08:02 · Личное сообщение · #5 Vadim Sergeevich пишет: попутно запрос IOCTL_VIDEO_MAP_VIDEO_MEMORY действительно мепирует видеопамять, но только под виртуалкой ...виртуальная машина использует вероятно какой-то свой штатный видеодрайвер(из комплекта VMWare Tools) или свою собственную видеосреду,если можно так выразиться,поэтому там в данном случае всё отображается нормально... ----- the Power of Reversing team |
|
Создано: 05 августа 2007 09:32 · Поправил: Crawler · Личное сообщение · #6 |
|
Создано: 08 августа 2007 19:23 · Личное сообщение · #7 |
|
Создано: 02 сентября 2007 00:13 · Личное сообщение · #8 Crawler >>А кто мешает вызвать что-то похожее на лок из DDraw, но из режима ядра? Ответ без воды: 1. Win32k.sys - это лишь подсистема Windows наряду с такими как POSIX или OS2, и этот файл вовсе необязательно (а с ним и заодно видеодрайвер (я не имею ввиду драйвер минипорта)) будет всегда мепированна в контексте памяти процесса в котором наш драйвер из которого мы пробуем чего-то вывести. 2. Ну хорошо, пусть мы поймали момент, когда видеодрайвер в памяти, но для того чтобы получить доступ к его функциям, мы должны вместо win32k.sys загрузить его в память и получить адреса тех самых функций работы с DirectDraw поверхностью которые он предоставляет заполняя структуры при своей первоначальной загрузке, а это по определению невозможно. Или возможно.. Но тогда я первому кто предложит способ пожму руку 3. С введением защиты контента в фильмах высокой четкости на аппаратном уровне, если будет возможен доступ к frame buffer значит будет возможность скопировать изображение с экрана, т.е. сграбить такой фильм. Т.о. объясняется поведение GeForce 8800 при попытке получить доступ к frame buffer. |
|
Создано: 02 сентября 2007 16:38 · Личное сообщение · #9 |
|
Создано: 08 сентября 2007 00:47 · Личное сообщение · #10 DillerInc Пока я вижу только такое объяснение. Только вот слово невозможность корректной работы это не совсем правильное выражение. Поскольку DirectDraw все же делает реальным получить старый frame buffer, но отладчик уже прийдется писать свой и для конкретной видеокарты, и использовать он уже будет порты ввода-вывода, а не обращения к драйверам видеокарты. |
eXeL@B —› Программирование —› Вывод на экран из драйвера |