Уроки Iczelion'а

       

Перехват создания и уничтожения VM


Когда создается вирутальная машина, VMM посылает контрольное сообщение Create_VM всем VxD. Также, когда VM завершает свою работу, она посылает всем VxD сообщение VM_Terminate и VM_Terminate2. Hаша задача проста: обработать сообщения Create_VM и VM_Terminate2 в нашей контрольной процедуре устройства. Когда наш VxD получает эти два контрольных сообщения, он отображает message box на экране.

Когда наш VxD получает сообщение Create_VM или VM_Terminate2, ebx содержит хэндл VM. VM-хэндл можно считать уникальным ID виртуальной машины. Каждая виртуальная машина имеет свой уникальный ID (хэндл VM). Вы можете использовать его так же, как вы используете ID процесса, передавая его в качестве параметра сервисам, которым он требуется.

При ближайшем рассмотрении VM-хэндл оказывается 32-битным линейным адресом контрольного блока VM (VMCB). VMCB - это структура, которая содержит некоторую важную информацию о VM. Она определена как:

cb_s STRUC CB_VM_Status DD ? CB_High_Linear DD ? CB_Client_Pointer DD ? CB_VMID DD ? CB_Signature DD ? cb_s ENDS

  • CB_VM_Status содержит битовые флаги, с помощью которых вы можете узнать о состоянии VM.
  • CB_High_Linear - это стартовый линейный адрес зеркала виртуальной машины общем системном pегионе (выше 3 гигабайт). Эта концепция требует объяснения. Под Windows 95, VxD не должен работать с V86-регионом напрямую, вместо этого VMM мэппирует все V86-регионы каждой виртуальной машины в общий системный регион. Когда VxD хочет изменить/обратиться к памяти в V86-регион виртуальной машины, ему следует сделать это, обратившись к соответствующей области в общем системном регионе. Hапример, если видеопамять находится по адресу 0B000h и вашему VxD требуется обратиться к этому адресу, ему следует добавить значение в CB_High_Linear к 0B8000h и обратиться к этой области. Изменения, которые вы сделаете в зеркале отобразятся в виртуальной машине. Использование зеркала во многих случаях является лучшим вариантом, так как вы можете изменять виртуальную машину, даже если она не является текущей VM.
  • CB_Client_Pointer содержит адреса клиентской структуры регистров. Эта структура содержит значения всех регистров прерванного приложения V86- или защищенного режима. Если ваш VxD хочет узнать/модифицировать состояние такого приложения, он может модифицировать поля клиентской структуры регистров и изменения распространятся на приложение, когда VMM продолжит его выполнение.
  • CB_VMID - числовой идентификатор виртуальной машины. VMM назначает этот номер, когда создает VM. У системной VM VMID pавен одному.
  • CB_Signature содержит строку "VMcb". Это поле используется для проверки того, является ли хэндл VM верным.


  • Содержание раздела