231 lines
5.7 KiB
NASM
231 lines
5.7 KiB
NASM
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
|
||
|