
				Uzywanie przerwan w VxD
				   Writeln by [CoxoC]

Exec_Int  jest to serwis ktory umozliwia nam wykonanie przerwania w naszym VxDku
	  serwis ten korzysta z serwisow Simulate_Int i Resume_Exec moze byc tylko 
	wtedy uzyty gdy "blok uruchomien" zostal stworzony przez Begin_Nest_Exec 
	lub Begin_Nest_V86_Exec serwis.

Serwis Simulate_Int uzywa Client_CS, Client_EIP, Client_Flags wiec nalezy przechowac 
	te wartosci.

hmm ale narazie nie wiemy jak tego serwisu uzywac wiec przydalo by sie odpalic SoftICE i
sprawdzic czy zaden ze standardowych VxDkow nie uzywa tego serwisu .

Nalezy wiec odpowiednio spreparowac plik winice.dat .Uhh po sleczeniu nad ksiazka 
"Windows 95 System programming SECRETS" Matta Pietreka doszedlem do wniosku ze wystarczy
dodac tylko te linie :

;	Silnik VxD

EXP=c:\windows\system\vmm32.vxd			; Virtual Manager
EXP=c:\windows\system\vmm32\ifsmgr.vxd		; Installable File System Manager
EXP=c:\windows\system\vmm32\ios.vxd		; I/O Supervisor (replaces BLOCKDEV)


Teraz zakladamy pulapke na Exec_Int i po paru milisekundach mamy odpowiedz jakis VxD 
uzywa tego serwisu :> na ekranie mamy 

	C0003A10	CALL [Simulate_Int]		(czesc VMM)
			MOV EAX,EAX
			itd.


A wiec to co pisali jest prawda :> wychodzimy z tego calla i jestesmy w VMPOLL 
Oto procedurka :

		SUB ESP,6Ch
		MOV EDI,ESP
		CALL [Save_Client_State]
		CALL [Begin_Nest_V86_Exec]
		MOV WORD PTR [EBP+1C],1607h
		MOV WORD PTR [EBP+10],0018h
		MOV WORD PTR [EBP+18],0000h
		MOV EAX,2Fh
		CALL [Exec_Int]
		MOV ECX,[EBP+1C]
		CALL [End_Nest_Exec]
		MOV ESI,ESP
		CALL [Restore_Client_State]
		ADD ESP,6Ch

Nasuwa sie pytanie jakie przerwanie ona wywoluje i co zapamietuje na stosie.....
wiec uruchamia ona przerwanie 2Fh ... Czas na Ralf Brown's Interrupt List :>
zobaczmy co kryje sie pod funkcja 1607h tegoz przerwania :

INT 2F 1607 - MS Windows - "VMPoll" VIRTUAL DEVICE - IDLE CALLOUT
callout or callback (usually hooked rather than called)

Category: W - MS Windows

Inp.:
	AX = 1607h
	BX = 0018h (VMPoll VxD ID) (see #02642)
	CX = 0000h
Return: AX = status
	    0000h if timeslice used
	    nonzero if timeslice not needed
Note:	when VMPoll makes this callout, all virtual machines are idle, and any
	  interested TSR can use the opportunity to perform background
	  processing

A wiec wszystko zaczyna wspolgrac ze soba 

		MOV WORD PTR [EBP+1C],1607h	< MOV AX,1607h
		MOV WORD PTR [EBP+10],0018h	< MOV BX,0018h
		MOV WORD PTR [EBP+18],0000h	< MOV CX,0000h


Ale gdzie tak naprawde zostaja wpisane te wartosci ? Odpowiedz jest prosta - w kodzie 
naszego VxDka te trzy rozkazy beda wygladaly nastepujaca :

		MOV [ebp.Client_AX],1607h
		MOV [ebp.Client_BX],0018h
		MOV [ebp.Client_CX],0000h

...konczac oto procedurka nadajaca sie do uzycia w kodzie naszego VxDka :

		SUB ESP,6Ch
		MOV EDI,ESP
		VxDCall Save_Client_State
		VxDCall Begin_Nest_V86_Exec
		MOV [ebp.Client_AX],1607h
		MOV [ebp.Client_BX],0018h
		MOV [ebp.Client_CX],0000h
		MOV EAX,2Fh
		VxDCall Exec_Int
		MOV ECX,[ebp.Client_EAX]
		VxDCall End_Nest_Exec
		MOV ESI,ESP
		VxDCall Restore_Client_State
		ADD ESP,6Ch

	..... oczywiscie nalezy uzywac innych przerwan .....


..... Analiza gruntowna .......

Serwis Save_Client_State jak sama nazwa na to wskazuje :P zapamietuje stan wszystkich
			 rejestrow klijenta. EDI na wejsciu ma wskazywac obszar w pamieci,
			 w ktory maja zostac wpisane te rejestry - rozmiar tego obszaru
			 to 6Ch , co tlumaczy rozkazy SUB ESP,6Ch i ADD ESP,6Ch
Serwis Restore_Client_State przywraca stan rejestrow klijenta . ESI na wejsciu ma wskazywac
			 obszar z ktorego maja byc pobierane dane

Z helpa dowiadujemy sie ze nie wolno przywracac rejestrow klijenta bezposrednio gdyz to
prowadzi do zawieszenia sie VMM.


Serwis Begin_Nest_V86_Exec z grubsza rzecz biarac konvertuje protected-mode calls w V86 calls
			uzywa Client_CS, Client_IP, Flags
Serwis End_Nest_Exec nasz VxDek misu zakonczyc "blok uruchomien" przed powrotem do VMM
			uzywa Client_CS, Client_IP, Flags


Przyklad ... 

		SUB ESP,6Ch
		MOV EDI,ESP
		VxDCall Save_Client_State
		VxDCall Begin_Nest_V86_Exec
		MOV [ebp.Client_AX],0E07h
		MOV EAX,10h
		VxDCall Exec_Int
		MOV ECX,[ebp.Client_EAX]
		VxDCall End_Nest_Exec
		MOV ESI,ESP
		VxDCall Restore_Client_State
		ADD ESP,6Ch

		.... uslyszysz krutki dzwiek

							Writeln by [CoxoC]