Leaked source code of windows server 2003
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

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