diff options
Diffstat (limited to 'private/ntos/nbt/vxd/vxdstub.asm')
-rw-r--r-- | private/ntos/nbt/vxd/vxdstub.asm | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/private/ntos/nbt/vxd/vxdstub.asm b/private/ntos/nbt/vxd/vxdstub.asm new file mode 100644 index 000000000..0404c3dda --- /dev/null +++ b/private/ntos/nbt/vxd/vxdstub.asm @@ -0,0 +1,250 @@ + name vxdstub +;************************************************************************ +; +; (C) Copyright MICROSOFT Corp., 1990-1991 +; +; Title: VXDSTUB.ASM +; +; Date: 1-Jun-1991 +; +; Author: Neil Sandlin +; +;************************************************************************ + INCLUDE INT2FAPI.INC +;----------------------------- M A C R O S ------------------------------ +Writel MACRO addr + push ax + push bx + push cx + push dx + + mov dx,offset &addr ;Print + mov cx,&addr&l + mov bx,1 ;stdout + mov ah,40h ;write + int 21h + + pop dx + pop cx + pop bx + pop ax + ENDM + +;----------------------------- E Q U A T E S ----------------------------- + +cr equ 0dh +lf equ 0ah + + +_TEXT segment word public 'CODE' + assume cs:_TEXT,ds:_DATA + +;*----------------------- TSR Data Area ---------------------* +InstData Win386_Startup_Info_Struc <> +oldint dd 0 + +;*----------------------- TSR Code --------------------------* + + +handle2f proc + cmp ax,1605h + jnz @f + push di + lea di,InstData + mov word ptr cs:[di].SIS_Next_Ptr,bx + mov word ptr cs:[di][2].SIS_Next_Ptr,es + pop di + push cs + pop es + lea bx,InstData +@@: + jmp DWORD PTR [oldint] +handle2f endp + + ALIGN 16 +init_fence: + +_TEXT ends + +;*---------------------- Initialization Data ------------------------* + +_DATA segment word public 'DATA' + +TSR_rsv dw ? + +intmsg db cr,lf,'Hooking interrupt ' +intmsgx dd ? + db cr,lf +intmsgl equ $-intmsg + +hndmsg db cr,lf,'ISR entry point: ' +hndmsga dd ? + db ':' +hndmsgb dd ? + db ', length=' +hndmsgc dd ? + db 'h bytes' + db cr,lf +hndmsgl equ $-hndmsg + +tsrmsg db 'TSR; reserving ' +tsrmsgx dd ? + db ' paragraphs' + db cr,lf +tsrmsgl equ $-tsrmsg + +_DATA ends + + +_TEXT segment word public 'CODE' +;*-------------------------- Initialization Code ----------------------* + +vxdstub proc far + mov ax, _DATA + mov ds, ax + +; get a pointer to the name of the load file in the environment seg. + + mov ah,62h + int 21h ;bx -> psp + mov es,bx + mov bx,2ch ;environment segment + mov es,es:[bx] + xor di,di + mov cx,-1 ;big number + xor al,al ;search for a null + cld +@@: + repne scasb ;get past one null and stop + cmp byte ptr es:[di],0 ;another null + jnz @b ;no. + add di,3 ;skip the word before the name. + +; prepare part of the instance data list. Stuff in pointer to the file name +; and refernce data + + lea si,InstData + mov word ptr CS:[si].SIS_Version,3 + mov word ptr CS:[si].SIS_Virt_Dev_File_Ptr,di + mov word ptr CS:[si][2].SIS_Virt_Dev_File_Ptr,es + + mov word ptr cs:[si].SIS_Instance_Data_Ptr,0 + mov word ptr cs:[si][2].SIS_Instance_Data_Ptr,0 + +; Write message and hook interrupt 2f + mov ax, 2fh + mov bx, offset intmsgx + call hexasc + + Writel intmsg + + mov ah, 35h + mov al, 2fh + int 21h ; get old vector + mov WORD PTR cs:oldint,bx ; save old vector here + mov WORD PTR cs:oldint+2,es + + push ds + mov dx, offset handle2f + push cs ; get current code segment + pop ds + mov ah, 25h + mov al, 2fh ; vector to hook + int 21h ; hook that vector + pop ds + + +; Print out some information about the handler + + push cs ; code segment + pop ax + mov bx, offset hndmsga + call hexasc + + mov ax, offset handle2f ; offset of ISR + mov bx, offset hndmsgb + call hexasc + + mov ax, offset init_fence ; length in bytes of handler + mov bx, offset hndmsgc + call hexasc + + Writel hndmsg + +; Compute size of TSR area + + mov dx, offset init_fence ; start of initialization code + add dx, 15 ; round it off to paragraph + shr dx, 1 ; divide by 16 + shr dx, 1 + shr dx, 1 + shr dx, 1 + add dx, 32 ; add in PSP + mov TSR_rsv, dx ; save it + + mov ax, dx + mov bx, offset tsrmsgx + call hexasc + + Writel tsrmsg + +; Terminate and stay resident + + mov ax, 3100h ; TSR + mov dx, TSR_rsv ; # of paragraphs to reserve + int 21h ; TSR +vxdstub endp + + + +;************************************************************************ +; +; HEXASC +; +; This subroutine formats hex values into ASCII +; (utility routine from Advanced MS-DOS Programming) +; +; +;************************************************************************ + +hexasc proc near ; converts word to hex ASCII + ; call with AX = value, + ; DS:BX = address for string + ; returns AX, BX destroyed + + push cx ; save registers + push dx + + mov dx,4 ; initialize character counter +hexasc1: + mov cx,4 ; isolate next four bits + rol ax,cl + mov cx,ax + and cx,0fh + add cx,'0' ; convert to ASCII + cmp cx,'9' ; is it 0-9? + jbe hexasc2 ; yes, jump + add cx,'A'-'9'-1 ; add fudge factor for A-F + +hexasc2: ; store this character + mov [bx],cl + inc bx ; bump string pointer + + dec dx ; count characters converted + jnz hexasc1 ; loop, not four yet + + pop dx ; restore registers + pop cx + ret ; back to caller + +hexasc endp + + + +_TEXT ends + + + + end vxdstub + +
\ No newline at end of file |