; drvrinfo.asm .MODEL SMALL,C INCLUDE snoop.inc PUBLIC drvrinfo .CODE drvrinfo PROC ARG int_vect:WORD,drvr_info_ptr:FAR LOCAL int_vect_addr:DWORD USES ax,bx,cx,dx,ds,es,si mov ax,int_vect ; load interrupt vector number mov cl,2H ; interrupt vect number * 4 shl ax,cl mov bx,ax ; offset into vector table mov dx,0000H mov es,dx ; make es point to segment of IVT mov cx,WORD PTR [es:bx] ; get offset mov WORD PTR [int_vect_addr],cx mov cx,WORD PTR [es:bx+2] ; get segment mov WORD PTR [int_vect_addr+2],cx mov ah,1H ; prepare to call pktdrvr mov al,0FFH mov bx,0H pushf call [int_vect_addr] push bx les bx,DWORD PTR [drvr_info_ptr] mov BYTE PTR [es:bx.drvr_functionality],al pop ax mov WORD PTR [es:bx.drvr_version],ax mov BYTE PTR [es:bx.drvr_class],ch mov BYTE PTR [es:bx.drvr_number],cl mov WORD PTR [es:bx.drvr_type],dx mov WORD PTR [es:bx.drvr_name+2],ds mov WORD PTR [es:bx.drvr_name],si mov al,BYTE PTR [es:bx.drvr_functionality] cmp al,0FFH jne continue mov ax,DRIVER_NOT_FOUND ; return 0 if al==255 jmp exit continue: mov ax,DRIVER_FOUND ; return 1 if al!=255 exit: ret ENDP END