Использование Mirror драйвера для записи всех изменений экрана компьютера в файл видеоформата FBR | Вестник Томского государственного университета. 2004. № 284.

Использование Mirror драйвера для записи всех изменений экрана компьютера в файл видеоформата FBR

Системы для записи всех изменений экрана в файл используются во множестве задач. Такие задачи можно разбить на три класса - создание демонстрационных видеороликов, тестирование программных продуктов и служба поддержки. К различным классам предъявляются разные требования. Но существует, по крайней мере, одно требование, общее для всех классов - программа записи не должна снижать общую производительность компьютера. В статье предлагается использовать mirror видеодрайвер для быстрого сохранения изменений при минимизации общего объема сохраняемой информации. Предложенный способ реализован в коммерческом продукте BB FlashBack, продающемся на рынке через Интернет.

Using Mirror video driver to capture all changes of the computer screen and storing them into the file of FBR format.pdf Существует, по крайней мере, два широко распростра-ненных способа захвата видеоинформации с экрана компью-тера. Оба способа основаны на периодическом захвате со-держимого всего экрана с последующей компрессией и со-хранением в файл. Первый способ использует стандартнуюграфическую подсистему Windows GDI, а второй способ ис-пользует функции мультимедиа библиотеки DirectX.Эти механизмы обладают двумя существенными недос-татками. Изменения экрана между двумя захватами теряются,а так как передача данных из памяти видеокарты в систем-ную память компьютера в несколько раз медленнее, чем пе-редача данных из системной памяти в системную память,происходит существенное уменьшение общей производи-тельности компьютера во время записи.Существует ряд улучшений вышеописанных способов,основанных на особенностях ОС Windows. Например, в про-грамме WinVNC [5] используются специальные хуки дляопределения областей экрана, которые подверглись измене-нию. Это позволяет существенно уменьшить количество дан-ных, пересылаемых из памяти видеокарты в память компью-тера. Но, к сожалению, данный способ не дает 100% гарантиина обнаружение всех изменений экрана.Для детектирования изменений экрана можно воспользо-ваться специальным свойством всех ОС Windows, начиная сверсии 2000, которое дублирует все вызовы графическойподсистемы на mirror видеодрайвер.Автором был написан собственный mirror драйвер, рабо-тающий в нулевом кольце защиты ОС, а также записываю-щее Win32 приложение, которое использует mirror драйвердля захвата изменений экрана.СТРУКТУРА ВИДЕОДРАЙВЕРАСледующая схема показывает все необходимыекомпоненты, требуемые для отображения информациипод управлением Windows 2000 и выше [3, 4, 6].Компоненты, выделенные серым цветом, поставля-ются вместе с операционной системой и они не зависятот типа видеооборудования и от видеодрайверов.Компоненты белого цвета поставляются сторонни-ми производителями.Эта схема работает следующим образом. Приложе-ние, работающее в User Mode, пытается вывести на эк-ран некоторую информацию. Все графические функ-ции в User Mode выполняются библиотекой GDI32.DLLподсистемы Win32. Библиотека GDI32.DLL не можетработать с видеодрайвером напрямую, так как она (каки приложение) работает в третьем кольце защиты. По-этому для обработки запроса происходит переход в ну-левое кольцо, в котором управление передается в гра-фическую библиотеку GDI в Kernel Mode.Библиотека Kernel Mode GDI имеет информацию отом, какие из всего набора DDI (Device Driver Interface)функций поддерживаются драйвером дисплея на аппа-ратном уровне. Если затребованная функция поддер-живается, то библиотека GDI вызывает соответствую-щую DDI функцию в драйвере дисплея. Если требуе-мая функция не поддерживается, то тогда вызываетсяпрограммная эмуляция функции. Библиотека Kernel ModeGDI может программно выполнить любую DDI-фун-кцию, она имеет весь необходимый для этого код.Если драйвер дисплея поддерживает DDI-функциюне полностью, то он может вызывать любую из ENGфункций, входящих в состав Kernel Mode GDI для про-граммной эмуляции той ее части, которая не реализо-вана на аппаратном уровне.Например, приложение вызывает WIN API функциюLineTo. Управление передается в библиотеку GDI32, ко-торая так же, как и приложение, работает в User Mode.Библиотека User Mode GDI использует программное пре-рывание INT или команду SYSENTER для передачиуправления в библиотеку Kernel Mode GDI. Kernel ModeGDI просматривает таблицу поддерживаемых драйверомдисплея DDI-функций. Если в этой таблице имеется точкавхода для DDI-функции DrvLineTo, то библиотека GDIвызывает эту функцию в драйвере дисплея. Если драйвердисплея по каким-то причинам не может выполнить этуфункцию, то он может воспользоваться ее программнойэмуляцией, имеющейся в библиотеке Kernel Mode GDI -EngLineTo. После того, как линия нарисована, управлениепередается обратно в библиотеку Kernel Mode GDI. Этабиблиотека осуществляет обратный переход в третье ко-льцо защиты и передает управление User Mode GDI, ко-торая возвращает управление приложению, вызывавшемуAPI-функцию LineTo.MIRROR ДРАЙВЕРMirror драйвер это видеодрайвер для виртуальногоустройства, который отображает графические операцииодного и более дополнительных физических устройств.Он должен быть написан как любой другой видеодрай-вер, однако часть этого драйвера − miniport − содержиттолько минимальный набор функций, который требу-ется для реального видеодрайвера.Любой видео miniport драйвер для семейства WindowsNT является Kernel Mode драйвером. Любая графическаякарта должна иметь два драйвера - видео miniport драй-вер и драйвер дисплея. Видео miniport драйвер работает всвязке с драйвером видеопорта, который поставляется соперационной системой и является динамически загру-жаемым Kernel Mode драйвером. Для работы с оборудо-ванием и системой miniport драйвер может вызыватьтолько функции драйвера видеопорта VideoPortXxx. На-чиная с Windows 2000 все miniport драйверы должныподдерживать технологию Plug and Play.GDI поддерживает функцию виртуального рабочегостола и обеспечивает возможность реплицированиячасти этого стола на mirror драйвер. GDI реализовываетвиртуальный рабочий стол как слой верхнего уровнянад драйвером дисплея. Все графические операцииначинаются на этом виртуальном рабочем столе. GDIотсекает и преобразовывает графические операции наконкретный физический дисплей, который существуетна виртуальном рабочем столе.Mirror драйвер может указать любой регион отсече-ния на виртуальном рабочем столе, включая даже та-кой, который разделяется между физическими устрой-ствами вывода. GDI посылает для mirror драйвера всеграфические операции, которые пересекаются с регио-ном отсечения. Mirror драйвер может установить реги-он отсечения целиком покрывающий только одно фи-зическое устройство, что гарантируют высокую эффек-тивность отображения всех графический операций это-го устройства на mirror драйвер.Таким образом, mirror драйвер должен состоять какминимум из двух драйверов - это видео miniport драй-вер и драйвер дисплея.Как правило, функций, которые могут быть исполь-зованы этим драйверами, недостаточно для написанияполезного драйвера. Поэтому к этим двум драйверамможно добавить еще один Kernel Mode драйвер, кото-рый будет выполнять все дополнительные функции,связанные с ядром операционной системы.РАЗРАБОТАННЫЙ MIRROR ДРАЙВЕРBB CAPTURE DRIVERBB Capture Driver является разновидностью mirrorдрайвера и используется для захвата графической ин-формации. Для написания драйвера был использованкомпилятор Visual C++ и набор библиотек Windows2000 DDK (Driver Development Kit). Драйвер BB CaptureDriver состоит из трех компонент:− видео miniport драйвер bbcap.sys;− драйвер дисплея bbcap.dll;− драйвер для связи с ядром ОС bbchlp.dll.Любой miniport драйвер должен включать несколь-ко обязательных функций. Самая главная функция,которая является точкой входа, имеет следующее опре-деление:ULONG DriverEntry ( PVOID Context1,PVOID Context2)Это единственная функция драйвера, которая долж-на быть экспортирована. Все остальные функции реги-стрируются в специальной структуре в теле функцииDriverEntry.Драйвер дисплея bbcap.dll выполняет самую глав-ную функцию - он перехватывает все графическиеоперации, делает предварительную обработку данныхи передает результат на дальнейшую обработку Win32приложению.Видео miniport драйвер и драйвер дисплея инициали-зируются сразу же после загрузки ядра NT и подсистемыWin32. Система загружает все те драйверы, которые ука-заны в реестре и затем определяет, какую из пар [miniportдрайвер, драйвер дисплея] использовать. В ходе этогопроцесса GDI открывает все необходимые драйвера дис-плея в соответствии с менеджером Windows.Базовую процедуру инициализации драйвера дис-плея можно представить в виде следующей диаграммы:Любой драйвер дисплея экспортирует только однуфункцию:BOOL DrvEnableDriver(IN ULONG iEngineVersion,IN ULONG cj,OUT DRVENABLEDATA *pded);Все остальные функции драйвера указываются вспециальной таблице поддерживаемых функций.Когда GDI пытается создать первый контекст уст-ройства (DC - Device Context) для видеооборудования,то GDI вызывает функцию DrvEnableDriver в драйвередисплея. В теле этой функции драйвер заполняетструктуру DRVENABLEDATA, в которой указываютсявсе те DDI-функции, которые поддерживаются драйве-ром, и точки входов в эти функции.Затем GDI вызывает функцию DrvEnablePDEV дляполучения описания физических характеристик устройст-ва. В эту функцию передается структура DEVMODEW,идентифицирующая режим, который хочет выставитьGDI. Если GDI запросила режим, который не поддержи-вается miniport драйвером или драйвером дисплея, тофункция DrvEnablePDEV должна вернуть ошибку.Функция DrvEnablePDEV инициализирует структу-ру PDEV. Надо сказать, что для одного и того же уст-ройства DrvEnablePDEV может быть вызвана несколь-ко раз, но только одна из всего множества созданныхструктур PDEV является активной в конкретный мо-мент времени. Поэтому драйвер дисплея не должениспользовать глобальных переменных. Все свои дан-ные драйвер должен выделять динамически, а указате-ли на выделенные области хранить в структуре PDEV.Как только инициализация прошла успешно, то GDIвызывает функцию DrvCompletePDEV. При помощиэтой функции GDI передает драйверу сгенерированныйдескриптор физического устройства.На последней стадии инициализации создается поверх-ность для видео оборудования посредством вызова функцииDrvEnableSurface. Создание поверхности разрешает выводграфической информации на физическое устройство.После успешной инициализации драйвера дисплеяGDI может вызывать любую из DDI-функций, поддер-живаемых драйвером.Так как целью драйвера дисплея bbcap является пе-рехват всех графических операций, то в него была за-ложена поддержка всех возможных DDI-вызовов.Драйвер утилит bbchlp.dll является Kernel Modeдрайвером и содержит набор функций, которые ис-пользуются драйвером дисплея для связи я ядром ОС.Так как драйвер bbchlp содержит только те функ-ции, которые необходимы для драйвера дисплея bbcap,то bbchlp не содержит точки входа, характерной длявсех драйверов.Драйвер bbchlp экспортирует следующие функции:Функция Значениеinit Выделяет блок памяти в системной области из невыгружаемого на диск пула. В нем хранится структураHelperData с данными, необходимыми для передачи параметров от драйвера дисплея драйверу bbchlp и вобратном направлении.done Освобождается ранее выделенный блок памяти.start Инициализируются поля структуры HelperData.stop Очищаются поля структуры HelperData.usercallbackПроизводит передачу управления в приложение Win32 User Mode.createandmapmemoryВыделяет память из невыгружаемого на диск пула указанного размера и отображает ее на частное адрес-ное пространство текущего процесса. Такой блок памяти доступен для чтения-записи как драйверу, так иприложению Win32 User Mode.unmapanddestroymemoryУничтожает блок памяти, который был выделен функцией createandmapmemory.querytimestampВозвращает текущее значение высокоточного таймера.waitevent2 Ждет наступления события 2.setevent1 Переводит событие 1 в сигнальное состояние.Для использования функций утилит драйвер дис-плея сначала загружает драйвер bbchlp в системнуюпамять при помощи GDI Kernel Mode функции:HANDLE EngLoadImage(IN LPWSTR pwszDriver);Для получения точек входов необходимых функцийиспользуется другая GDI-функция:PVOID EngFindImageProcAddress(IN HANDLE hModule,IN LPSTR lpProcName);WIN32 ПРИЛОЖЕНИЕ USER MODEWin32 приложение BB FlashBack содержит весь необхо-димый пользовательский интерфейс, заложенный в систему.Все элементы интерфейса доступны через систему меню всистемной области панели задач на рабочем столе.Интерфейс состоит из трех частей: простой, продви-нутой и профессиональной. Простой интерфейс предна-значен для обычного рядового пользователя, которыйможет начать запись, не настраивая никаких дополни-тельных параметров. Пользователь может начать запись,выбрав пункт Record из меню системной области.Продвинутый интерфейс пользователя обеспечива-ет ряд настроек, которыми регулируются параметрызаписи. Например, имеется возможность переключатьразрешение экрана перед началом записи и возвращатьисходное разрешение после ее окончания.Дополнительные настройки, рассчитанные на профес-сионального пользователя, включают в себя управлениеуровнем компрессии результирующего файла, типом ком-прессии, а также включение или отключение поддержки си-стемы процессорных команд MMX/SSE. Эти команды ис-пользуются в драйвере для оптимизации алгоритмов пред-варительной обработки изображений. Если пользовательзаметил какие-нибудь отклонения при работе с драйверомдисплея bbcap, то он может попробовать отключить под-держку MMX/SSE и устранить обнаруженную проблему.Взаимодействие между Win32-приложением и драй-вером дисплея происходит при помощи специальнойGDI-функции:int DrawEscape(HDC hdc,// handle to DCint nEscape,// escape functionint cbInput, // size of structurefor inputLPCSTR lpszInData // structurefor input);Данная функция обеспечивает выполнение специ-альных функций видеоадаптером, которые не поддер-живаются библиотекой GDI. Библиотека Kernel ModeGDI вызывает функцию DrvDrawEscape в драйвередисплея, если она поддерживается драйвером.ULONG DrvDrawEscape(IN SURFOBJ *pso,IN ULONG iEsc,IN CLIPOBJ *pco,IN RECTL *prcl,IN ULONG cjIn,IN PVOID *pvIn);Таким образом, драйвер дисплея bbcap, работающий внулевом кольце защиты, может получать команды ипараметры из Win32-приложения, работающего в тре-тьем кольце защиты, оставаясь в контексте того про-цесса, который вызывал функцию DrawEscape.Драйвер поддерживает следующий набор команд:Команда ЗначениеSTART По команде START драйвер производит все необходимые действия, связанные с началом записи. Выделя-ется память, создаются события, инициализируются структуры, необходимые для записи.PAUSE Команда PAUSE переводит драйвер в режим ожидания. После получения этой команды драйвер перестаетобрабатывать графическую информацию и не передает никаких данных в win32 приложение.STOP По команде STOP драйвер останавливает все действия по захвату и обработке графической информации,освобождает память и уничтожает все созданные события.VERSION Команда VERSION запрашивает текущую версию драйвера. Эта команда позволяет записывающей win32программе корректно обрабатывать данные, поступающие от драйвера.STORESCREENЕсли win32 приложению необходим весь экран в виде одно графического события формата FBR, то при-ложение может послать драйверу команду STORESCREEN для копирования всего экрана целиком.STOREBACKSCREENПо команде STOREBACKSCREEN драйвер сохраняет дополнительный буфер экрана в виде одного гра-фического события формата FBR.STOREUSEREVENTИногда приложению win32 необходимо встроить свое графическое событие в непрерывную цепочку со-бытий, поступающих от драйвера. Это событие должно иметь время наступления, вписывающееся в кон-текст всей цепочки событий и того места, куда оно вставляется. Win32 приложение формирует событие ввиде структуры и передает ее драйверу, используя команду STOREUSEREVENT. Драйвер изменяет толь-ко одно поле этой структуры − время наступления этого события. После чего структура встраивается впорядке очереди в цепочку событий и при наступлении подходящего момента передается обратно win32приложению для записи в выходной файл.После начала записи драйвер производит захват графи-ческой информации. Он производит предварительную обра-ботку данных и передает результат на дальнейшую обработ-ку в Win32-приложение. Непосредственный обмен даннымиидет через специальную область памяти, которая доступнана чтение и запись и драйверу и Win32-приложению.Win32-приложение производит обработку данных, по-ступивших от драйвера. Так как драйвер bbcap перехватыва-ет все графические операции, то имеется возможность опре-делять те из них, которые являются векторными и сохранятьне двоичный результат, а описание векторной операции, чтосущественно уменьшает размер выходных данных.Драйвер bbcap в состоянии определить рисование точек,линий, полигонов, а также операции сдвига изображений.Результат обработки сохраняется в выходной файлформата FBR [1].ЗАКЛЮЧЕНИЕНаписан специальный mirror драйвер bbcap и win32приложение, использующее этот драйвер для захвата со-держимого экрана. Созданная система оказывает мини-мальное влияние на общую производительность систе-мы при минимизации объема сохраняемых данных.Программа и драйвер используются в коммерче-ском пакете BB FlashBack, демонстрационная версиякоторого может быть закачена с сайтаhttp://www.bbconsult.co.uk/.

Ключевые слова

Авторы

ФИООрганизацияДополнительноE-mail
Лавров Валерий АлександровичТомский государственный университетстарший преподаватель кафедры теоретических основ информатики факультета информатики
Всего: 1

Ссылки

 Использование Mirror драйвера для записи всех изменений экрана компьютера в файл видеоформата FBR | Вестник Томского государственного университета. 2004. № 284.

Использование Mirror драйвера для записи всех изменений экрана компьютера в файл видеоформата FBR | Вестник Томского государственного университета. 2004. № 284.

Полнотекстовая версия