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