Annotation of ntddk/src/vdd/appints/fax16/fax16.asm, revision 1.1

1.1     ! root        1:     name    faxdrv
        !             2:     title   'FAX16 - Stub driver for Application based intercept under NT'
        !             3: 
        !             4: ;
        !             5: ; fax16.asm: This is a very simple DOS stub device driver for NTVDM.
        !             6: ;           It shows how to use application based intercept services
        !             7: ;           provided by NTVDM. FAX32.dll is its DLL which will be loaded
        !             8: ;           in the NTVDM process by this stub device driver.
        !             9: ;
        !            10: ;           This driver only has meaningful code for init,read and write.
        !            11: ;           Rest all command codes always succeed. We are assuming here
        !            12: ;           that the 16 bit fax application for this stub device driver
        !            13: ;           opens this device and just make read and write calls. The
        !            14: ;           meaning of read is to get a fax message and write means
        !            15: ;           send a message
        !            16: 
        !            17: _TEXT  segment byte public 'CODE'
        !            18: 
        !            19:        assume cs:_TEXT,ds:_TEXT,es:NOTHING
        !            20: 
        !            21:        org     0
        !            22: 
        !            23:        include isvbop.inc
        !            24: 
        !            25: MaxCmd   equ   24                  ; Maximum allowed command
        !            26: 
        !            27: ; VDD Command codes
        !            28: 
        !            29: OpGet    equ   1                   ; Read a FAX
        !            30: OpSend   equ   2                   ; Send a FAX
        !            31: 
        !            32: Header:                            ; Fax Device Header
        !            33:        DD  -1
        !            34:        DW  0c840h
        !            35:        DW  FaxStrat
        !            36:        DW  FaxIntr
        !            37:        DB  'FAXDRV00'
        !            38: 
        !            39: RHPtr  DD  ?                       ; Pointer to Request Header
        !            40: 
        !            41: Dispatch:                          ; Interrupt routine command code
        !            42:        DW  Init
        !            43:        DW  MediaChk
        !            44:        DW  BuildBPB
        !            45:        DW  IoctlRd
        !            46:        DW  Read
        !            47:        DW  NdRead
        !            48:        DW  InpStat
        !            49:        DW  InpFlush
        !            50:        DW  Write
        !            51:        DW  WriteVfy
        !            52:        DW  OutStat
        !            53:        DW  OutFlush
        !            54:        DW  IoctlWt
        !            55:        DW  DevOpen
        !            56:        DW  DevClose
        !            57:        DW  RemMedia
        !            58:        DW  OutBusy
        !            59:        DW  Error
        !            60:        DW  Error
        !            61:        DW  GenIOCTL
        !            62:        DW  Error
        !            63:        DW  Error
        !            64:        DW  Error
        !            65:        DW  GetLogDev
        !            66:        DW  SetLogDev
        !            67: 
        !            68: DllName   DB "FAX32.DLL",0
        !            69: InitFunc  DB "FAXVDDRegisterInit",0
        !            70: DispFunc  DB "FAXVDDDispatch",0
        !            71: 
        !            72: F32Mes   DB "We are called from 32 staff", 10, 13, "$"
        !            73: 
        !            74: hVDD     DW    ?
        !            75: 
        !            76: FaxStrat    proc    far            ; Strategy Routine
        !            77: 
        !            78:     mov     word ptr cs:[RhPtr],bx
        !            79:     mov     word ptr cs:[RhPtr+2],es
        !            80:     ret
        !            81: 
        !            82: FaxStrat    endp
        !            83: 
        !            84: FaxIntr     proc    far            ; INterrupt routine
        !            85: 
        !            86:     push    ax                     ; Save registers
        !            87:     push    bx
        !            88:     push    cx
        !            89:     push    dx
        !            90:     push    ds
        !            91:     push    es
        !            92:     push    di
        !            93:     push    si
        !            94:     push    bp
        !            95: 
        !            96:     push    cs
        !            97:     pop     ds                     ; DS = CS
        !            98: 
        !            99:     les     di,[RHPtr]             ; ES:DI = request header
        !           100: 
        !           101:     mov     bl,es:[di+2]
        !           102:     xor     bh,bh                  ; BX = command code
        !           103:     cmp     bx,MaxCmd
        !           104:     jle     FIntr1
        !           105: 
        !           106:     call    Error                  ; Unknown command
        !           107:     jmp     FIntr2
        !           108: 
        !           109: FIntr1:
        !           110:     shl     bx,1
        !           111:     call    word ptr [bx+Dispatch]  ; call command routine
        !           112:     les     di,[RhPtr]             ; ES:DI = request header
        !           113: 
        !           114: FIntr2:
        !           115:     or     ax,0100h                ; Set Done bit in the status
        !           116:     mov     es:[di+3],ax           ; Store the status
        !           117: 
        !           118:     pop     bp                     ; restore registers
        !           119:     pop     si
        !           120:     pop     di
        !           121:     pop     es
        !           122:     pop     ds
        !           123:     pop     dx
        !           124:     pop     cx
        !           125:     pop     bx
        !           126:     pop     ax
        !           127: 
        !           128:     ret
        !           129: 
        !           130: 
        !           131: MediaChk    proc    near
        !           132:     xor     ax,ax
        !           133:     ret
        !           134: MediaChk    endp
        !           135: 
        !           136: BuildBPB    proc    near
        !           137:     xor     ax,ax
        !           138:     ret
        !           139: BuildBPB    endp
        !           140: 
        !           141: IoctlRd            proc    near
        !           142:     xor     ax,ax
        !           143:     ret
        !           144: IoctlRd            endp
        !           145: 
        !           146: Read       proc    near
        !           147:     push    es
        !           148:     push    di                                 ; Save Request Header add
        !           149: 
        !           150:     mov     bx,word ptr es:[di+14]             ; buffer offset
        !           151:     mov     ax,word ptr es:[di+16]             ; buffer segment
        !           152:     mov     cx,word ptr es:[di+18]             ; buffer length
        !           153: 
        !           154:     mov     es,ax                              ; es:bx is the buffer where
        !           155:                                                ; fax has to be read from
        !           156:                                                ; the NT device driver
        !           157: 
        !           158:     mov     ax,word ptr cs:[hVDD]              ; VDD handle returned by
        !           159:                                                ; register module
        !           160:     mov     dx,OpGet                           ; Read the fax command
        !           161: 
        !           162:     DispatchCall
        !           163: 
        !           164:     pop     di
        !           165:     pop     es
        !           166: 
        !           167:     jnc     rOK                                ; NC -> Success and CX has
        !           168:                                                ; the count read.
        !           169: 
        !           170:     call    Error                              ; Operation Failed
        !           171:     ret
        !           172: 
        !           173: rOK:
        !           174:     mov     word ptr es:[di+12],cx             ; return in header how much
        !           175:                                                ; was read
        !           176:     xor     ax,ax
        !           177:     ret
        !           178: Read       endp
        !           179: 
        !           180: NdRead     proc    near
        !           181:     xor     ax,ax
        !           182:     ret
        !           183: NdRead     endp
        !           184: 
        !           185: InpStat            proc    near
        !           186:     xor     ax,ax
        !           187:     ret
        !           188: InpStat            endp
        !           189: 
        !           190: InpFlush    proc    near
        !           191:     xor     ax,ax
        !           192:     ret
        !           193: InpFlush    endp
        !           194: 
        !           195: Write      proc    near
        !           196:     push    es
        !           197:     push    di                                 ; Save Request Header add
        !           198: 
        !           199:     mov     bx,word ptr es:[di+14]             ; buffer offset
        !           200:     mov     ax,word ptr es:[di+16]             ; buffer segment
        !           201:     mov     cx,word ptr es:[di+18]             ; buffer length
        !           202: 
        !           203:     mov     es,ax                              ; es:bx is the FAX message      where
        !           204:                                                ; to be send by NT device
        !           205:                                                ; driver
        !           206: 
        !           207:     mov     ax,word ptr cs:[hVDD]              ; VDD handle returned by
        !           208:                                                ; register module
        !           209:     mov     dx,OpSend                          ; Send the fax command
        !           210: 
        !           211:     DispatchCall
        !           212: 
        !           213:     pop     di
        !           214:     pop     es
        !           215: 
        !           216:     jnc     wOK                                ; NC -> Success and CX has
        !           217:                                                ; the count read.
        !           218: 
        !           219:     call    Error                              ; Operation Failed
        !           220:     ret
        !           221: 
        !           222: wOK:
        !           223:     mov     word ptr es:[di+12],cx             ; return in header how much
        !           224:                                                ; was actually written
        !           225:     xor     ax,ax
        !           226:     ret
        !           227: Write      endp
        !           228: 
        !           229: WriteVfy    proc    near
        !           230:     xor     ax,ax
        !           231:     ret
        !           232: WriteVfy    endp
        !           233: 
        !           234: OutStat            proc    near
        !           235:     xor     ax,ax
        !           236:     ret
        !           237: OutStat     endp
        !           238: 
        !           239: OutFlush    proc    near
        !           240:     xor     ax,ax
        !           241:     ret
        !           242: OutFlush    endp
        !           243: 
        !           244: IoctlWt            proc    near
        !           245:     xor     ax,ax
        !           246:     ret
        !           247: IoctlWt     endp
        !           248: 
        !           249: DevOpen            proc    near
        !           250:     xor     ax,ax
        !           251:     ret
        !           252: DevOpen     endp
        !           253: 
        !           254: DevClose    proc    near
        !           255:     xor     ax,ax
        !           256:     ret
        !           257: DevClose    endp
        !           258: 
        !           259: RemMedia    proc    near
        !           260:     xor     ax,ax
        !           261:     ret
        !           262: RemMedia    endp
        !           263: 
        !           264: OutBusy            proc    near
        !           265:     xor     ax,ax
        !           266:     ret
        !           267: OutBusy     endp
        !           268: 
        !           269: GenIOCTL    proc    near
        !           270:     xor     ax,ax
        !           271:     ret
        !           272: GenIOCTL    endp
        !           273: 
        !           274: GetLogDev   proc    near
        !           275:     xor     ax,ax
        !           276:     ret
        !           277: GetLogDev   endp
        !           278: 
        !           279: SetLogDev   proc    near
        !           280:     xor     ax,ax
        !           281:     ret
        !           282: SetLogDev   endp
        !           283: 
        !           284: Error      proc    near
        !           285:     mov     ax,8003h                           ; Bad Command Code
        !           286:     ret
        !           287: Error      endp
        !           288: ;
        !           289: ;
        !           290: ; This function is a sample sub that calling from 32-bits part of VDD
        !           291: ;
        !           292: From32Sub   proc    near
        !           293: 
        !           294:     push    cs
        !           295:     pop     ds
        !           296:     mov     dx, offset F32mes
        !           297:     mov     ah, 09h
        !           298:     int     21h
        !           299:     VDDUnSimulate16
        !           300:     ret
        !           301: 
        !           302: From32Sub   endp
        !           303: 
        !           304: Init       proc    near
        !           305:     push    es
        !           306:     push    di                                 ; Save Request Header add
        !           307: 
        !           308:     push    ds
        !           309:     pop     es
        !           310: 
        !           311:     ; Load fax32.dll
        !           312:     mov     si, offset DllName                 ; ds:si = fax32.dll
        !           313:     mov     di, offset InitFunc                 ; es:di = init routine
        !           314:     mov     bx, offset DispFunc                ; ds:bx = dispatch routine
        !           315:     mov     ax, offset From32Sub               ; ds:ax = From32Sub
        !           316: 
        !           317: 
        !           318:     RegisterModule
        !           319:     jnc     saveHVDD                           ; NC -> Success
        !           320: 
        !           321:     call    Error                              ; Indicate failure
        !           322: 
        !           323:     pop     di
        !           324:     pop     es
        !           325:     mov     byte ptr es:[di+13],0              ; unit supported 0
        !           326:     mov     word ptr es:[di+14],offset Header  ; Unload this device
        !           327:     mov     word ptr es:[di+16],cs
        !           328:     mov     si, offset Header
        !           329:     and            [si+4],8FFFh                        ; clear bit 15 for failure
        !           330:     ret
        !           331: 
        !           332: saveHVDD:
        !           333:     mov     [hVDD],ax
        !           334: 
        !           335:     pop     di
        !           336:     pop     es
        !           337:     mov     word ptr es:[di+14],offset Init    ; Free Memory address
        !           338:     mov     word ptr es:[di+16],cs
        !           339: 
        !           340:     xor     ax,ax                              ; return success
        !           341:     ret
        !           342: Init       endp
        !           343: 
        !           344: FaxIntr            endp
        !           345: 
        !           346: _TEXT      ends
        !           347: 
        !           348:     end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.