Nasz VxD ma mozliwosc zakladania filtrow , przejmowania serwisow innego wirtualnego urzadzenia w celu monitorowania lub podmiany serwisu na swoj itd. A wiec potrzebna jest czesc kodu inicjalizacyjna i konczaca wykonywanie VxDka.Czyli :
BeginProc HookIntFF pushfd pushad ;wszystkie rejestry na stos
mov AH,[ebp.Client_AH] cmp AH,04h je ...
itd..
popad ;przywroc wszystkie wartosci popfd clc ret EndProc KookIntFF
VXD_LOCKED_CODE_ENDS
Powyzszy przyklad przejmuje przerwanie FFh.Widac,ze odczyt stanu rejestrow przed wywolaniem tego przerwania wyglada nastepujaca :
mov AH,[ebp.Client_AH]
Oczywiscie jak chcemy odczytac wartosc innego rejestru to napiszemy :
mov BX,[ebp.Client_DS] mov EAX,[ebp.Client_EIP] itd.
Ale koniec z tymi przerwaniami narazie ....
Aby przejac serwis innego wirtualnego urzadzenia uzywa sie serwisu Hook_Device_Service Przykladowo gdy chcemy przejac serwis VKD_Get_Kbd_Owner napiszemy :
.... lecz w tym momencie musimy byc ostrozni gdyz gdy przejmujemy takie serwisy ktore obsluguja np mysz wtedy gdy usuniemy swoja procedurke w sposob pokazany wyzej to przy nastepnym ruchu myszka zawiesi sie system !! dlaczego ? zauwazmy,ze serwis Hook_Device_Service zwraca w esi entrypoint do poprzedniej procedury obslugi tego serwisu nie na darmo zreszta ! gdyz jak by byly np. dwie procki obslugi to system by nie wiedzial do ktorej skoczyc (poniewaz jest tak juz napisany). Wiec czasami aby usunac nasza procke obslugi serwisu musimy uzyc :