summaryrefslogblamecommitdiffstats
path: root/private/mvdm/vdd/samples/sample1/fax16/fax16.asm
blob: 0d8a6d86a11736258e2b215b16abd5d4056e2b5e (plain) (tree)



























































































































































































































































































































































                                                                                     
    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