Уроки Iczelion'а




Hемного теории: - часть 2


CB_Client_Pointer содержит указатель на CRS этой VM. Hапример, вы можете получить указатель на CRS текущей VM с помощью следующего кода:

VMMCall Get_Cur_VM_Handle ; возвращает хэндл текущей VM в ebx assume ebx:ptr cb_s mov ebp,[ebx+CB_Client_Pointer] ; указатель на CRS

Теперь, когда мы изучили CRS, мы можем перейти к ее непосредственному применению. Мы будем использовать CRS, чтобы передавать значения регистров MS-DOS-прерыванию 21h, сервису 2h (отображение символа). Этот сервис MS-DOS получает символ, который должен быть отображен, в dl. Если мы передаем символ 07h этому сервису, он проиграет некий звук с помощью PC-спикера.

Помните, что этот int 21h - это сервис MS-DOS, который доступен в режиме V86, так как мы можем вызвать V86-прерывание из VxD? Один пут - это использовать сервис Exec_Int. Этот сервис VMM получает номер прерывания, который нужно вызвать в eax. Тем не менее, он должен находиться внутри особого блока кода, который начинается с Begin_Nest_V86_Exec и заканчивается End_Nest_Exec. Поэтому если нам нужно вызывать int 21h, сервис 2, нам потребуется изменить Client_ah и Client_Dl в CRS внутри такого блока выполнения и затем сохранить значение 21h в eax. Когда все будет готово, можно вызывать Exec_Int.




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