You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
7.0 KiB
348 lines
7.0 KiB
name faxdrv
|
|
title 'FAX16 - Stub driver for Application based intercept under NT'
|
|
|
|
;
|
|
; fax16.asm: This is a very simple DOS stub device driver for NTVDM.
|
|
; It shows how to use application based intercept services
|
|
; provided by NTVDM. FAX32.dll is its DLL which will be loaded
|
|
; in the NTVDM process by this stub device driver.
|
|
;
|
|
; This driver only has meaningful code for init,read and write.
|
|
; Rest all command codes always succeed. We are assuming here
|
|
; that the 16 bit fax application for this stub device driver
|
|
; opens this device and just make read and write calls. The
|
|
; meaning of read is to get a fax message and write means
|
|
; send a message
|
|
|
|
_TEXT segment byte public 'CODE'
|
|
|
|
assume cs:_TEXT,ds:_TEXT,es:NOTHING
|
|
|
|
org 0
|
|
|
|
include isvbop.inc
|
|
|
|
MaxCmd equ 24 ; Maximum allowed command
|
|
|
|
; VDD Command codes
|
|
|
|
OpGet equ 1 ; Read a FAX
|
|
OpSend equ 2 ; Send a FAX
|
|
|
|
Header: ; Fax Device Header
|
|
DD -1
|
|
DW 0c840h
|
|
DW FaxStrat
|
|
DW FaxIntr
|
|
DB 'FAXDRV00'
|
|
|
|
RHPtr DD ? ; Pointer to Request Header
|
|
|
|
Dispatch: ; Interrupt routine command code
|
|
DW Init
|
|
DW MediaChk
|
|
DW BuildBPB
|
|
DW IoctlRd
|
|
DW Read
|
|
DW NdRead
|
|
DW InpStat
|
|
DW InpFlush
|
|
DW Write
|
|
DW WriteVfy
|
|
DW OutStat
|
|
DW OutFlush
|
|
DW IoctlWt
|
|
DW DevOpen
|
|
DW DevClose
|
|
DW RemMedia
|
|
DW OutBusy
|
|
DW Error
|
|
DW Error
|
|
DW GenIOCTL
|
|
DW Error
|
|
DW Error
|
|
DW Error
|
|
DW GetLogDev
|
|
DW SetLogDev
|
|
|
|
DllName DB "FAX32.DLL",0
|
|
InitFunc DB "FAXVDDRegisterInit",0
|
|
DispFunc DB "FAXVDDDispatch",0
|
|
|
|
F32Mes DB "We are called from 32 staff", 10, 13, "$"
|
|
|
|
hVDD DW ?
|
|
|
|
FaxStrat proc far ; Strategy Routine
|
|
|
|
mov word ptr cs:[RhPtr],bx
|
|
mov word ptr cs:[RhPtr+2],es
|
|
ret
|
|
|
|
FaxStrat endp
|
|
|
|
FaxIntr proc far ; INterrupt routine
|
|
|
|
push ax ; Save registers
|
|
push bx
|
|
push cx
|
|
push dx
|
|
push ds
|
|
push es
|
|
push di
|
|
push si
|
|
push bp
|
|
|
|
push cs
|
|
pop ds ; DS = CS
|
|
|
|
les di,[RHPtr] ; ES:DI = request header
|
|
|
|
mov bl,es:[di+2]
|
|
xor bh,bh ; BX = command code
|
|
cmp bx,MaxCmd
|
|
jle FIntr1
|
|
|
|
call Error ; Unknown command
|
|
jmp FIntr2
|
|
|
|
FIntr1:
|
|
shl bx,1
|
|
call word ptr [bx+Dispatch] ; call command routine
|
|
les di,[RhPtr] ; ES:DI = request header
|
|
|
|
FIntr2:
|
|
or ax,0100h ; Set Done bit in the status
|
|
mov es:[di+3],ax ; Store the status
|
|
|
|
pop bp ; restore registers
|
|
pop si
|
|
pop di
|
|
pop es
|
|
pop ds
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
|
|
ret
|
|
|
|
|
|
MediaChk proc near
|
|
xor ax,ax
|
|
ret
|
|
MediaChk endp
|
|
|
|
BuildBPB proc near
|
|
xor ax,ax
|
|
ret
|
|
BuildBPB endp
|
|
|
|
IoctlRd proc near
|
|
xor ax,ax
|
|
ret
|
|
IoctlRd endp
|
|
|
|
Read proc near
|
|
push es
|
|
push di ; Save Request Header add
|
|
|
|
mov bx,word ptr es:[di+14] ; buffer offset
|
|
mov ax,word ptr es:[di+16] ; buffer segment
|
|
mov cx,word ptr es:[di+18] ; buffer length
|
|
|
|
mov es,ax ; es:bx is the buffer where
|
|
; fax has to be read from
|
|
; the NT device driver
|
|
|
|
mov ax,word ptr cs:[hVDD] ; VDD handle returned by
|
|
; register module
|
|
mov dx,OpGet ; Read the fax command
|
|
|
|
DispatchCall
|
|
|
|
pop di
|
|
pop es
|
|
|
|
jnc rOK ; NC -> Success and CX has
|
|
; the count read.
|
|
|
|
call Error ; Operation Failed
|
|
ret
|
|
|
|
rOK:
|
|
mov word ptr es:[di+12],cx ; return in header how much
|
|
; was read
|
|
xor ax,ax
|
|
ret
|
|
Read endp
|
|
|
|
NdRead proc near
|
|
xor ax,ax
|
|
ret
|
|
NdRead endp
|
|
|
|
InpStat proc near
|
|
xor ax,ax
|
|
ret
|
|
InpStat endp
|
|
|
|
InpFlush proc near
|
|
xor ax,ax
|
|
ret
|
|
InpFlush endp
|
|
|
|
Write proc near
|
|
push es
|
|
push di ; Save Request Header add
|
|
|
|
mov bx,word ptr es:[di+14] ; buffer offset
|
|
mov ax,word ptr es:[di+16] ; buffer segment
|
|
mov cx,word ptr es:[di+18] ; buffer length
|
|
|
|
mov es,ax ; es:bx is the FAX message where
|
|
; to be send by NT device
|
|
; driver
|
|
|
|
mov ax,word ptr cs:[hVDD] ; VDD handle returned by
|
|
; register module
|
|
mov dx,OpSend ; Send the fax command
|
|
|
|
DispatchCall
|
|
|
|
pop di
|
|
pop es
|
|
|
|
jnc wOK ; NC -> Success and CX has
|
|
; the count read.
|
|
|
|
call Error ; Operation Failed
|
|
ret
|
|
|
|
wOK:
|
|
mov word ptr es:[di+12],cx ; return in header how much
|
|
; was actually written
|
|
xor ax,ax
|
|
ret
|
|
Write endp
|
|
|
|
WriteVfy proc near
|
|
xor ax,ax
|
|
ret
|
|
WriteVfy endp
|
|
|
|
OutStat proc near
|
|
xor ax,ax
|
|
ret
|
|
OutStat endp
|
|
|
|
OutFlush proc near
|
|
xor ax,ax
|
|
ret
|
|
OutFlush endp
|
|
|
|
IoctlWt proc near
|
|
xor ax,ax
|
|
ret
|
|
IoctlWt endp
|
|
|
|
DevOpen proc near
|
|
xor ax,ax
|
|
ret
|
|
DevOpen endp
|
|
|
|
DevClose proc near
|
|
xor ax,ax
|
|
ret
|
|
DevClose endp
|
|
|
|
RemMedia proc near
|
|
xor ax,ax
|
|
ret
|
|
RemMedia endp
|
|
|
|
OutBusy proc near
|
|
xor ax,ax
|
|
ret
|
|
OutBusy endp
|
|
|
|
GenIOCTL proc near
|
|
xor ax,ax
|
|
ret
|
|
GenIOCTL endp
|
|
|
|
GetLogDev proc near
|
|
xor ax,ax
|
|
ret
|
|
GetLogDev endp
|
|
|
|
SetLogDev proc near
|
|
xor ax,ax
|
|
ret
|
|
SetLogDev endp
|
|
|
|
Error proc near
|
|
mov ax,8003h ; Bad Command Code
|
|
ret
|
|
Error endp
|
|
;
|
|
;
|
|
; This function is a sample sub that calling from 32-bits part of VDD
|
|
;
|
|
From32Sub proc near
|
|
|
|
push cs
|
|
pop ds
|
|
mov dx, offset F32mes
|
|
mov ah, 09h
|
|
int 21h
|
|
VDDUnSimulate16
|
|
ret
|
|
|
|
From32Sub endp
|
|
|
|
Init proc near
|
|
push es
|
|
push di ; Save Request Header add
|
|
|
|
push ds
|
|
pop es
|
|
|
|
; Load fax32.dll
|
|
mov si, offset DllName ; ds:si = fax32.dll
|
|
mov di, offset InitFunc ; es:di = init routine
|
|
mov bx, offset DispFunc ; ds:bx = dispatch routine
|
|
mov ax, offset From32Sub ; ds:ax = From32Sub
|
|
|
|
|
|
RegisterModule
|
|
jnc saveHVDD ; NC -> Success
|
|
|
|
call Error ; Indicate failure
|
|
|
|
pop di
|
|
pop es
|
|
mov byte ptr es:[di+13],0 ; unit supported 0
|
|
mov word ptr es:[di+14],offset Header ; Unload this device
|
|
mov word ptr es:[di+16],cs
|
|
mov si, offset Header
|
|
and [si+4],8FFFh ; clear bit 15 for failure
|
|
ret
|
|
|
|
saveHVDD:
|
|
mov [hVDD],ax
|
|
|
|
pop di
|
|
pop es
|
|
mov word ptr es:[di+14],offset Init ; Free Memory address
|
|
mov word ptr es:[di+16],cs
|
|
|
|
xor ax,ax ; return success
|
|
ret
|
|
Init endp
|
|
|
|
FaxIntr endp
|
|
|
|
_TEXT ends
|
|
|
|
end
|