name mscdexnt ; ; MSCDEXNT ; ; Author: Neil Sandlin (neilsa) ; ; Description: ; ; This TSR implements the v86 mode portion of MSCDEX support under ; NT. Basically, all this piece does is hook INT2F and watch for ; MSCDEX calls. When the first one occurs, it tries to load VCDEX.DLL. ; If that succeeds, it passes the call (and all subsequent calls) ; to VCDEX for processing. ; include isvbop.inc include mscdexnt.inc _TEXT segment word public 'CODE' assume cs:_TEXT,ds:_TEXT,es:_TEXT ;*----------------------- TSR Code --------------------------* DrvStrat proc far ; Strategy Routine ret DrvStrat endp DrvIntr proc far ; INterrupt routine ret DrvIntr endp ;****************************************************************************** ; ; Int2FHook ; ; ;****************************************************************************** Int2FHook proc near cmp ah, MSCDEX_ID ;MSCDEX? jnz int2fchain ;no cmp al, MAX_MSCDEX_CMD ;command too high? ja int2fchain ;yes cmp word ptr cs:[hVDD], 0 ;zero is an invalid module handle jnz callvdd ;registered ok cmp byte ptr cs:[fVDDChecked],1 jz vddfailed call RegisterVDD jc vddfailed ;didn't get it callvdd: push ax ;put ax on stack mov ax, word ptr cs:[hVDD] DispatchCall add sp, 2 ;vdd has set ax accordingly iret ;svc handled, return to caller vddfailed: or al,al jnz try_0b xor bx,bx jmp short int2f_done try_0b: cmp al,0bh jne int2f_done ;; williamh - June 1 1993 - if unable to load VDD, we should tell ;; the caller that the drive is NOT a cd rom. xor ax, ax mov bx,0adadh int2f_done: iret int2fchain: jmp dword ptr cs:[oldint] Int2FHook endp ;**************************************************************************** ; ; RegisterVDD ; ;**************************************************************************** RegisterVDD proc near push ax push bx push cx push dx push si push di push ds push es mov ax, cs mov ds, ax mov es, ax ; Load vcdex.dll mov si, offset DllName ; ds:si = dll name mov di, offset InitFunc ; es:di = init routine mov bx, offset DispFunc ; ds:bx = dispatch routine push cs ; pass far pointer to headers pop cx ; in cx:dx mov dx, offset drive_header RegisterModule jc errorexit ; jif error mov cs:[hVDD],ax ; save handle errorexit: mov byte ptr cs:[fVDDChecked],1 pop es pop ds pop di pop si pop dx pop cx pop bx pop ax ret RegisterVDD endp ;*----------------------- TSR Data Area ---------------------* oldint dd 0 hVDD DW 0 fVDDChecked DB 0 ; 0 - VDD never called. 1 - VDD once called. DllName DB "VCDEX.DLL",0 InitFunc DB "VDDRegisterInit",0 DispFunc DB "VDDDispatch",0 ALIGN 16 drive_header: DrvHd 'MSCDEX00' ALIGN 16 Init_Fence: ;*-------------------------- Initialization Code ----------------------* mscdexnt proc far ; at this point es,ds -> PSP ; SS:SP points to stack ; first check that we are running under NT mov ax, GET_NT_VERSION int 21h cmp bl, NT_MAJOR_VERSION je cdx_chk_more jmp cdx_exit cdx_chk_more: cmp bh, NT_MINOR_VERSION je cdx_ver_ok jmp cdx_exit cdx_ver_ok: ; Now check that this TSR is'nt already installed mov ah,MSCDEX_ID mov al,0bh ; call function 0b int MPX_INT ; int 2f cmp bx,0adadh jne cdx_chks_done jmp cdx_exit cdx_chks_done: ; free the env segment push es push ds mov es, es:[2ch] mov ah, 49h int 21h mov ah, DOS_GET_VECTOR mov al, MPX_INT ; 2f int 21h ; get old vector mov WORD PTR cs:oldint,bx ; save old vector here mov WORD PTR cs:oldint+2,es mov dx, offset Int2FHook push cs ; get current code segment pop ds mov ah, DOS_SET_VECTOR mov al, MPX_INT ; vector to hook int 21h ; hook that vector ; ; Compute size of TSR area ; pop ds pop es mov dx, offset Init_Fence ; end of fixed TSR code mov cl, 4 ; divide by 16 shr dx, cl add dx, 16 ; add in PSP ; ; Terminate and stay resident ; mov ah, DOS_TSR ; TSR mov al, 0 int 21h ; TSR cdx_exit: mov ax,4c00h ; Exit int 21h mscdexnt endp _TEXT ends InitStack segment para stack 'STACK' dw 256 dup (?) top_of_stack equ $ InitStack ends end mscdexnt