Уроки Iczelion'а



Формат LE


VxD использует формат линейных исполняемых файлов (linear executable file format - LE). Этот формат был спроектирован для OS/2 вверсии 2.0. Он может содержать как 16-битный, так и 32-битный код, что является одним из требований к VxD. Помните, что VxD начали свою историю еще в эпоху Windows 3.x. В то время Windows загружалась из DOS'а, поэтому VxD должны были выполнять определенные действия в реальном режиме, прежде чем Windows переключала машину в защищенный режим. 16-битный код реального режима должен был находиться в том же файле, что и 32-битный код защищенного режима. Поэтому файловый LE-формат был очевидным выбором. Драйвера Windows NT не имеют дела с pеальным pежимом, поэтому им не надо использовать LE-формат. Вместо этого они используют PE-формат.

Код и данные в LE-файле хранятся в сегментах с различными аттрибутами выполнения. Они приводятся ниже.

  • LCODE - 'рage-locked' код и данные. Этот сегмент "заперт" в памяти. Иными словами, этот сегмент не может быть выгружен на диск, поэтому этот класс сегментов целесообразно использовать тогда, когда нельзя тратить попусту драгоценное системное время. Код и данные должны всегда присутствовать в памяти. Особенно это нужно для обработчиков хардварных прерываний.
  • PCODE - выгружаемый код. Выгрузка на диск и загрузка кода в память регулируется VMM. Код в этом сегменте может не присутствовать все время в памяти (например, если VMM срочно понадобилась физическая память, он может выгрузить этот сегмент на время).
  • PDATA - то же самое, только это сегмент с данными, а не с кодом.
  • ICODE - код только для инициализации. Код в этом сегменте используется только во время инициализации VxD. После инициализации, этот сегмент будет выгружен из памяти, чтобы освободить физическую память.
  • DBCODE - код и данные только для отладки. Код и данные в этом сегменте используются только тогда, когда вы запускает VxD под отладчиком. Hапример, код может содержать обработчик для контрольного сообщения Debug_Query.
  • SCODE - статические код и данные. Этот сегмент будет всегда присутствовать в памяти, даже когда VxD будет выгружен. Этот сегмент особенно полезен для динамических VxD, так как они могут выгружаться много раз во время рабочей Windows-сессии, в то время как требуется, чтобы сохранялось их конфигурация/состояние.
  • RCODE - инициализационные код и данные pеального pежима. Этот сегмент содержит 16-битные код и данные для инициализации в реальном pежиме.
  • 16ICODEUSE16 - инициализационные данные защищенного pежима. Этот сегмент содержит код, который VxD скопирует из защищенного режима в V86-режим. Hапример, если вы хотите скопировать какой-то код V86-режима, этот код должен находиться в этом сегменте. Если вы поместите код в другой сегмент, ассемблер сгенерирует неправильный код, так как он будет генерировать 32-битный код вместо полагающегося 16-битного.
  • MCODE - "запертые" строки сообщений. Этот сегмент содержит строки сообщений, которые скомпилированны с помощью макросов сообщений VMM. Это поможет вам создать интернациональные версии вашего драйвера.




Содержание  Назад  Вперед