
				 SYSTEM SERWISOW
				Writeln by [CoxoC]


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 :


VXD_Icode_Seg

BeginProc	PIERWSZY_Device_Init

      mov      eax, FFh
      mov      esi, OFFSET32 HookIntFF
      VMMCall  Hook_V86_Int_Chain	;przejmij przerwanie FFh (trybu V86)


	clc		;informacja dla systemu ze procedura zakonczyla sie powodzeniem
	ret
EndProc		PIERWSZY_Device_Init

VXD_Icode_Ends

VXD_Locked_Code_Seg

BeginProc	PIERWSZY_Device_Exit

      mov      eax, FFh
      mov      esi, OFFSET32 HookIntFF
      VMMCall  UnHook_V86_Int_Chain	; nie bede tego opisywal :>


	clc
	ret
EndProc		PIERWSZY_Device_Exit


;=====================
;	Procedura obslugi przerwania FFh
;=====================

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 :

	GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
	mov	esi, offset32 Proc_Get_Kbd_Owner
	VMMCall	Hook_Device_Service
	mov	Poprzednia_Proc, esi

A gdy chcemy usunac swoja procedure napiszemy :

	GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
	mov	esi, offset32 Proc_Get_Kbd_Owner
	VMMCall	UnHook_Device_Service

.... 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 :

	GetVxDServiceOrdinal eax, VKD_Get_Kbd_Owner
	mov	      esi,Poprzednia_Proc
	VMMCall	Hook_Device_Service


GetVxDServiceOrdinal jest to makro ktore do EAX wpisuje reprezentacje liczbowa serwisu
		     podanego w parametrze drugim

A VMMCall uzywa sie do uruchamiania serwisow urzadzenia VMM (Virtual Manager)


