home *** CD-ROM | disk | FTP | other *** search
- title REBOOTDR.ASM -- Installable device driver for OS/2 reboot
- .286
-
- ; REBOOTDR.ASM
- ; By Mitch Stuart and Paul Chen
- ;
- ; Reference: TEMPLATE.ASM, Page 377, in Ray Duncan's "Advanced
- ; OS/2 Programming," Microsoft Press, 1989.
- ;
- ; To assemble and link:
- ;
- ; masm rebootdr.asm;
- ; link rebootdr,rebootdr.sys,,os2,rebootdr
- ;
- ; Apparently some versions of the linker will call the resulting file
- ; "REBOOTDR.DLL" even though we specifed ".SYS" on the command line.
- ; In this case, just rename REBOOTDR.DLL to REBOOTDR.SYS and it will
- ; work fine.
- ;
- ; To install, add the line "DEVICE=REBOOTDR.SYS" to the CONFIG.SYS file.
- ; To reboot, type REBOOT2. REBOOT2.EXE is a program file that simply
- ; attempts to open the device "REBOOTZZ", thus causing the machine to
- ; reboot.
- ;
- ; Description:
- ;
- ; This device driver gets installed at boot time. It sets up a
- ; dummy character device driver called "REBOOTZZ". Then, when an
- ; application opens the device "REBOOTZZ", this driver gets control.
- ; It calls one of the DevHlp functions to get the system reboot
- ; vector, and then jumps to that address, causing the system to reboot.
- ;
- maxcmd equ 26
-
- stdin equ 0
- stdout equ 1
- stderr equ 2
-
- cr equ 0dh
- lf equ 0ah
-
- GetDosVar equ 24h
- GetRebootVector equ 5
-
- extrn DosWrite:far
-
- DGROUP group _DATA
-
- _DATA segment word public 'DATA'
-
- ; ***** Device driver header
-
- header dd -1
- dw 8880h
- dw Strat ; our "stragegy" entry point
- dw 0
- db 'REBOOTZZ'
- db 8 dup (0)
-
- ; ***** Device driver variables
-
- devhlp dd ? ; DevHlp entry point
- wlen dw ? ; DosWrite length
-
- ; ***** Dispatch table
-
- dispch dw Init ; 0 Init driver
- dw ReturnOK ; 1 Media check
- dw ReturnOK ; 2 Build BPB
- dw Error ; 3 not used
- dw ReturnOK ; 4 Read
- dw ReturnOK ; 5 Nondestructive read
- dw ReturnOK ; 6 Return input status
- dw ReturnOK ; 7 Flush input buffers
- dw ReturnOK ; 8 Write
- dw ReturnOK ; 9 Write with verify
- dw ReturnOK ; 10 Return output status
- dw ReturnOK ; 11 Flush output buffers
- dw Error ; 12 not used
- dw DevOpen ; 13 Open
- dw ReturnOK ; 14 Close
- dw ReturnOK ; 15 Removable media
- dw ReturnOK ; 16 Generic IOCTL
- dw ReturnOK ; 17 Reset media
- dw ReturnOK ; 18 Get logical drive
- dw ReturnOK ; 19 Set logical drive
- dw ReturnOK ; 20 Deinstall
- dw Error ; 21 not used
- dw ReturnOK ; 22 Partitionable fixed disks
- dw ReturnOK ; 23 Get fixed disk unit map
- dw Error ; 24 not used
- dw Error ; 25 not used
- dw Error ; 26 not used
-
- ident db cr,lf
- db 'OS/2 reboot driver loaded. '
- db 'Type REBOOT2 to reboot system.'
- db cr,lf
- ident_len equ $ - ident
-
- _DATA ends
-
-
- _TEXT segment word public 'CODE'
-
- assume cs:_TEXT,ds:DGROUP,es:NOTHING
-
- Strat proc far
- mov di,es:[bx+2] ; get command code
- and di,0ffh
- cmp di,maxcmd ; supported command?
- jle Strat1 ; yes
- call Error ; unsupported command
- jmp Strat2
-
- Strat1: add di,di ; branch to command handler
- call word ptr [di+dispch]
-
- Strat2: mov es:[bx+3],ax ; return status code
- ret
- Strat endp
-
-
- DevOpen proc near
-
- ; Get the address of the reboot vector
- mov dl,GetDosVar
- mov al,GetRebootVector
- call devhlp
-
- ; AX:BX now contains the reboot vector
- ; We want it to be in ES:BX for a far jump
- mov es, ax
-
- ; Jump to vector and reboot
- jmp dword ptr es:[bx]
-
- ; We should never get here, but return just in case ...
- mov ax,0100h ; return "done" status
- ret
- DevOpen endp
-
-
- Error proc near ; set error bit, done status
- mov ax,8103h ; and unknown command code
- ret
- Error endp
-
-
- ReturnOK proc near
- mov ax,0100h ; return "done" status
- ret
- ReturnOK endp
-
-
- Init proc near
- mov ax,es:[bx+14] ; get DevHlp entry point
- mov word ptr devhlp,ax
- mov ax,es:[bx+16]
- mov word ptr devhlp+2,ax
-
- ; set offsets to end of code and data segments
- mov word ptr es:[bx+14],offset _TEXT:Init
- mov word ptr es:[bx+16],offset DGROUP:ident
-
- ; display sign-on message
- push stdout
- push ds
- push offset DGROUP:ident
- push ident_len
- push ds
- push offset DGROUP:wlen
- call DosWrite
-
- mov ax,0100h ; return "done"
- ret
- Init endp
-
- _TEXT ends
-
- end
-
-
-