Анализ:
Push_Client_State
Здесь особо нечего анализировать. Когда VxD получает сообщение DeviceIoControl, ebр уже указывает на CRS текущей VM. Мы вызываем макрос Push_Client_State, чтобы сохранить текущее состояние клиентских регистров в стеке. Позже мы восстановим их значение с помощью Pop_Client_State.
VMMCall Begin_Nest_V86_Exec
Hачинаем особый блок выполнения с помощью вызова Begin_Nest_V86_Exec.
assume ebp:ptr Client_Byte_Reg_Struc
mov [ebp].Client_dl,7 mov [ebp].Client_ah,2
Изменяем значения регистров dl и ah в CRS. Эти измененные значения будут использованы прерыванием.
mov eax,21h VMMCall Exec_Int
Exec_Int получает номер прерывания из eax. Мы помещаем в него нужное значение и вызываем Exec_Int.
VMMCall End_Nest_Exec Pop_Client_State
Когда Exec_Int возвращает значение, мы заканчиваем особый блок выполнения и восстанавливаем сохраненные значения клиентских регистров из стека.
Вы услышите, как ваш PC-спикер проигрывает 'bell'-символ (07h).
[C] Iczelion, пер. Aquila.