Annotation of ntddk/src/vdd/dosioctl/dosdrvr/dosdrvr.asm, revision 1.1.1.1

1.1       root        1:         name    dosdrvr
                      2:         title   'DOSDRVR - Stub driver for Application based intercept under NT'
                      3: ;******************************************************************************
                      4: ;
                      5: ;       DOSDRVR
                      6: ;
                      7: ;       This DOS character device driver demonstrates basic communication
                      8: ;       with a NT VDD. It handles DOS OPEN, CLOSE and IOCTL Read requests.
                      9: ;
                     10: ;   Operation:
                     11: ;
                     12: ;       INIT - Issues RegisterModule() call to get VDD handle.
                     13: ;
                     14: ;       OPEN, CLOSE, IOCTL Read - The VDD exposes a private interface
                     15: ;       that correspond to these DOS calls. The driver basically passes
                     16: ;       these calls from a DOS application on to the VDD using the
                     17: ;       DispatchCall() function.
                     18: ;
                     19: ;******************************************************************************
                     20: 
                     21: 
                     22: _TEXT   segment byte public 'CODE'
                     23: 
                     24:         assume  cs:_TEXT,ds:_TEXT,es:NOTHING
                     25: 
                     26:         org     0
                     27: 
                     28:         include isvbop.inc
                     29: 
                     30: MaxCmd  equ     24                      ; Maximum DOS command value
                     31: 
                     32: ; VDD Command codes
                     33: 
                     34: VDDOPEN equ     1
                     35: VDDCLOSE equ    2
                     36: VDDINFO equ     3
                     37: 
                     38: Header:                                 ; Device Header
                     39:         DD      -1
                     40:         DW      0c840h
                     41:         DW      DrvStrat
                     42:         DW      DrvIntr
                     43:         DB      'DOSDRV00'
                     44: 
                     45: RHPtr   DD      ?                       ; Pointer to Request Header
                     46: 
                     47: 
                     48: DllName DB      "IOCTLVDD.DLL",0
                     49: InitFunc  DB    "VDDRegisterInit",0
                     50: DispFunc  DB    "VDDDispatch",0
                     51: 
                     52: hVDD    DW      ?
                     53: 
                     54: Dispatch:                               ; Interrupt routine command code
                     55:         DW      Init
                     56:         DW      DrvNOP               ; MediaChk
                     57:         DW      DrvNOP               ; BuildBPB
                     58:         DW      IoctlRd
                     59:         DW      DrvNOP               ; Read
                     60:         DW      DrvNOP               ; NdRead
                     61:         DW      DrvNOP               ; InpStat
                     62:         DW      DrvNOP               ; InpFlush
                     63:         DW      DrvNOP               ; Write
                     64:         DW      DrvNOP               ; WriteVfy
                     65:         DW      DrvNOP               ; OutStat
                     66:         DW      DrvNOP               ; OutFlush
                     67:         DW      DrvNOP               ; IoctlWt
                     68:         DW      DevOpen
                     69:         DW      DevClose
                     70:         DW      DrvNOP               ; RemMedia
                     71:         DW      DrvNOP               ; OutBusy
                     72:         DW      Error
                     73:         DW      Error
                     74:         DW      DrvNOP               ; GenIOCTL
                     75:         DW      Error
                     76:         DW      Error
                     77:         DW      Error
                     78:         DW      DrvNOP               ; GetLogDev
                     79:         DW      DrvNOP               ; SetLogDev
                     80: 
                     81: ;******************************************************************************
                     82: ;
                     83: ;       DrvStrat
                     84: ;       DrvIntr
                     85: ;
                     86: ;       The following routines are standard, required DOS driver routines.
                     87: ;       The DrvIntr routine uses the "Dispatch" table to call the appropriate
                     88: ;       subroutine, based on the driver request.
                     89: ;
                     90: ;******************************************************************************
                     91: DrvStrat proc   far              ; Strategy Routine
                     92: 
                     93:         mov     word ptr cs:[RhPtr],bx
                     94:         mov     word ptr cs:[RhPtr+2],es
                     95:         ret
                     96: 
                     97: DrvStrat endp
                     98: 
                     99: DrvIntr proc    far                     ; INterrupt routine
                    100: 
                    101:         push    ax                      ; Save registers
                    102:         push    bx
                    103:         push    cx
                    104:         push    dx
                    105:         push    ds
                    106:         push    es
                    107:         push    di
                    108:         push    si
                    109:         push    bp
                    110: 
                    111:         push    cs
                    112:         pop     ds                      ; DS = CS
                    113: 
                    114:         les     di,[RHPtr]              ; ES:DI = request header
                    115: 
                    116:         mov     bl,es:[di+2]
                    117:         xor     bh,bh                   ; BX = command code
                    118:         cmp     bx,MaxCmd
                    119:         jle     FIntr1
                    120: 
                    121:         call    Error                   ; Unknown command
                    122:         jmp     FIntr2
                    123: 
                    124: FIntr1:
                    125:         shl     bx,1
                    126:         call    word ptr [bx+Dispatch]  ; call command routine
                    127:         les     di,[RhPtr]              ; ES:DI = request header
                    128: 
                    129: FIntr2:
                    130:         or      ax,0100h                ; Set Done bit in the status
                    131:         mov     es:[di+3],ax            ; Store the status
                    132: 
                    133:         pop     bp                      ; restore registers
                    134:         pop     si
                    135:         pop     di
                    136:         pop     es
                    137:         pop     ds
                    138:         pop     dx
                    139:         pop     cx
                    140:         pop     bx
                    141:         pop     ax
                    142:         ret
                    143: 
                    144: DrvIntr endp
                    145: 
                    146: DrvNOP  proc    near
                    147:         xor     ax,ax
                    148:         ret
                    149: DrvNOP  endp
                    150: 
                    151: Error   proc    near
                    152:         mov     ax,8003h                           ; Bad Command Code
                    153:         ret
                    154: Error   endp
                    155: 
                    156: 
                    157: ;******************************************************************************
                    158: ;
                    159: ;       IoctlRd
                    160: ;
                    161: ;       This routine is entered when a DOS application issues an IOCTL READ
                    162: ;       to this driver. The target buffer address for the IOCTL is passed
                    163: ;       on to the VDD.
                    164: ;
                    165: ;******************************************************************************
                    166: IoctlRd proc    near
                    167: 
                    168:         push    es
                    169:         push    di
                    170: 
                    171:         mov     ax, word ptr cs:[hVDD]       ; VDD handle
                    172:         mov     dx, VDDINFO
                    173:         mov     cx, es:[di+18]               ; size of buffer
                    174:         les     di, es:[di+14]               ; pointer to target buffer
                    175:         DispatchCall
                    176: 
                    177:         pop     di
                    178:         pop     es
                    179: 
                    180:         jnc     @f                           ; jif Success
                    181: 
                    182:         call    Error                        ; Operation Failed
                    183:         ret
                    184: 
                    185: @@:
                    186:         mov     es:[di+18], cx               ; # of bytes read
                    187:         xor     ax,ax
                    188:         ret
                    189: 
                    190: IoctlRd endp
                    191: 
                    192: ;******************************************************************************
                    193: ;
                    194: ;       DevOpen
                    195: ;
                    196: ;       This routine is entered when a DOS application does a DOS OPEN to
                    197: ;       this driver. The open request is passed along to the VDD.
                    198: ;
                    199: ;******************************************************************************
                    200: DevOpen proc    near
                    201: 
                    202:         mov     ax, word ptr cs:[hVDD]       ; VDD handle
                    203:         mov     dx, VDDOPEN                  ; Open file
                    204:         DispatchCall
                    205:         jnc     @f                           ; jif Success
                    206:         call    Error                        ; Operation Failed
                    207:         ret
                    208: @@:
                    209:         xor     ax,ax
                    210:         ret
                    211: 
                    212: DevOpen endp
                    213: 
                    214: ;******************************************************************************
                    215: ;
                    216: ;       DevClose
                    217: ;
                    218: ;       This routine is entered when a DOS application issues a CLOSE on the
                    219: ;       handle for the driver. A close request is issued to the VDD.
                    220: ;
                    221: ;******************************************************************************
                    222: DevClose proc   near
                    223: 
                    224:         mov     ax, word ptr cs:[hVDD]       ; VDD handle
                    225:         mov     dx, VDDCLOSE                 ; Close file
                    226: 
                    227:         DispatchCall
                    228:         jnc     @f                           ; jif Success
                    229:         call    Error                        ; Operation Failed
                    230:         ret
                    231: @@:
                    232:         xor     ax,ax
                    233:         ret
                    234: 
                    235: DevClose endp
                    236: 
                    237: 
                    238: ;******************************************************************************
                    239: ;
                    240: ;       INIT
                    241: ;
                    242: ;       This routine is entered when the VDM is booting. The code in this
                    243: ;       routine is only present during initialization. Here, a RegisterModule
                    244: ;       is issued to get a handle to the VDD. This handle is then used by
                    245: ;       the DispatchCall's in the other driver routines.
                    246: ;
                    247: ;       If RegisterModule returns with error, then the driver indicates to
                    248: ;       DOS that an error occurred.
                    249: ;
                    250: ;******************************************************************************
                    251: Init    proc    near
                    252:         push    es
                    253:         push    di                                   ; Save Request Header add
                    254: 
                    255:         push    ds
                    256:         pop     es
                    257: 
                    258:         ; Load ioctlvdd.dll
                    259:         mov     si, offset DllName                   ; ds:si = dll name
                    260:         mov     di, offset InitFunc                  ; es:di = init routine
                    261:         mov     bx, offset DispFunc                  ; ds:bx = dispatch routine
                    262: 
                    263:         RegisterModule
                    264:         jnc     saveHVDD                             ; NC -> Success
                    265: 
                    266:         call    Error                                ; Indicate failure
                    267: 
                    268:         pop     di
                    269:         pop     es
                    270:         mov     byte ptr es:[di+13],0                ; unit supported 0
                    271:         mov     word ptr es:[di+14],offset Header    ; Unload this device
                    272:         mov     word ptr es:[di+16],cs
                    273:         mov     si, offset Header
                    274:         and     [si+4],8FFFh                         ; clear bit 15 for failure
                    275:         ret
                    276: 
                    277: saveHVDD:
                    278:         mov     [hVDD],ax
                    279: 
                    280:         pop     di
                    281:         pop     es
                    282:         mov     word ptr es:[di+14],offset Init      ; Free Memory address
                    283:         mov     word ptr es:[di+16],cs
                    284:         xor     ax,ax                                ; return success
                    285:         ret
                    286: Init    endp
                    287: 
                    288: _TEXT   ends
                    289: 
                    290:         end

unix.superglobalmegacorp.com

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