' $INCLUDE: 'QBX.BI' 'Re-Boot the machine DEF SEG = 0 keylock% = PEEK(1047) POKE 1047, 0 DEF SEG KEY 15, CHR$(&H84) + CHR$(&H46) KEY 16, CHR$(&H4) + CHR$(&H46) KEY 17, CHR$(&H8C) + CHR$(&H53) KEY 18, CHR$(&HC) + CHR$(&H53) ON KEY(15) GOSUB brk ON KEY(16) GOSUB brk ON KEY(17) GOSUB ctrldel ON KEY(18) GOSUB ctrldel KEY(15) ON KEY(16) ON KEY(17) ON KEY(18) ON CONST ax = 1, bx = 2, cx = 3, dx = 4, bp = 5 CONST si = 6, di = 7, flags = 8 DIM inRegs(1 TO 8) AS INTEGER, outregs(1 TO 8) AS INTEGER DIM inter AS INTEGER noos = 0 noot = 0 noop = 0 nooc = 0 t$ = "" s = 0 np = 0 nd = 0 passwd = 0 passcd = 0 pass = 0 pass$ = "" passcd$ = "" ret = 0 inter = &H18 PRINT PRINT "Re-Boot Program for PC ATs and Compatibles" PRINT "(c)1996 M.London" PRINT IF COMMAND$ = "" THEN PRINT : PRINT "/? for help" FOR a = 1 TO LEN(COMMAND$) - 1 IF MID$(COMMAND$, a, 1) = "/" THEN switch$ = MID$(COMMAND$, a + 1, 1) switch$ = LCASE$(switch$) SELECT CASE switch$ CASE "?" GOTO help CASE "t" IF noot = 1 THEN GOTO ndloop noos = 1 IF MID$(COMMAND$, a + 2, 1) <> ":" OR MID$(COMMAND$, a + 5, 1) <> ":" OR MID$(COMMAND$, a + 3, 1) > "2" OR MID$(COMMAND$, a + 6, 1) > "6" THEN PRINT : PRINT "Invalid Args": GOTO help h = VAL(MID$(COMMAND$, a + 3, 2)) m = VAL(MID$(COMMAND$, a + 6, 2)) t$ = LTRIM$(STR$(h)) + ":" + LTRIM$(STR$(m)) CASE "s" IF noos = 1 THEN GOTO ndloop noot = 1 IF MID$(COMMAND$, a + 2, 1) <> ":" THEN PRINT : PRINT "Invalid Args": GOTO help s = VAL(MID$(COMMAND$, a + 3, 2)) CASE "n" inter = &H19 np = 1 CASE "d" nd = 1 CASE "c" IF MID$(COMMAND$, a + 2, 1) <> ":" THEN PRINT "Invalid Args!": GOTO help FOR x = 3 TO 6 IF MID$(COMMAND$, a + x, 1) < "0" OR MID$(COMMAND$, a + x, 1) > "9" THEN PRINT "Invalid Args!": GOTO help NEXT x pass = VAL(MID$(COMMAND$, a + 3, 4)) passcd = 1 CASE "i" inter = &H19 CASE "p" message$ = "" PRINT LINE INPUT "Enter Password : "; pass$ pass$ = UCASE$(pass$) CLS passwd = 1 END SELECT END IF ndloop: NEXT a IF np = 1 OR passcd = 1 THEN GOTO reboot PRINT : PRINT "Are you sure you wish to Re-Boot? "; : SLEEP: a$ = INKEY$: a$ = UCASE$(a$): IF a$ <> "Y" THEN PRINT "N": PRINT : END ELSE PRINT "Y": PRINT GOTO reboot help: PRINT PRINT "Re-Boot Command, uses BIOS Interrupt 18h or 19h" PRINT "Program (c)1996 M.London" PRINT PRINT "Switches: /? - This Screen" PRINT " /n - No prompt (INT 19h)" PRINT " /t:hh:mm - Reboot at set time (hh:mm)" PRINT " /s:ss - Reboot in ss seconds" PRINT " /d - No display upto boot (CLS)" PRINT " /c:xxxx - Passcode, xxxx is a 4 digit number" PRINT " /i - Use Int 19h, for some incompatible machines" PRINT " /p - Password, specify upon program startup" PRINT PRINT "/c is prompted for before a re-boot and also before an abort." PRINT "/p is prompted for before an abort only" PRINT PRINT "Switches /t and /s CAN NOT be used together" PRINT GOTO nd: reboot: IF nd = 1 THEN CLS IF t$ <> "" THEN y = CSRLIN + 1 IF y > 20 THEN CLS : y = 1 LOCATE y, 1 IF nd = 0 THEN PRINT "Re-Boot time : "; t$; ":00" LOCATE y + 3, 1 IF nd = 0 THEN PRINT "Esc to Abort!" DO UNTIL LEFT$(TIME$, 5) = t$ LOCATE y + 1, 1 IF nd = 0 THEN PRINT "Current time : "; TIME$ a$ = INKEY$ IF a$ = CHR$(27) THEN ret = 1: IF passcd = 1 OR passwd = 1 THEN GOSUB password ELSE GOTO nd LOOP END IF IF s <> 0 THEN y = CSRLIN + 1 IF y > 20 THEN CLS : y = 1 LOCATE y + 2, 1 IF nd = 0 THEN PRINT "Esc to Abort!" DO UNTIL s = 0 LOCATE y, 1 IF nd = 0 THEN PRINT "Seconds Remaining to Re-Boot : "; s s = s - 1 SLEEP 1 a$ = INKEY$ IF a$ = CHR$(27) THEN ret = 1: IF passcd = 1 OR passwd = 1 THEN GOSUB password ELSE GOTO nd LOOP END IF PRINT IF passcd = 1 THEN passcd$ = "" q = CSRLIN + 1 IF q > 22 THEN q = 1: CLS LOCATE q, 1 PRINT "Enter Passcode : "; x = 1 DO UNTIL x = 5 SLEEP a$ = INKEY$ IF a$ = CHR$(8) AND x > 1 THEN x = x - 1 passcd$ = LEFT$(passcd$, (LEN(passcd$) - 1)) LOCATE q, 18 + x PRINT " "; LOCATE q, 18 + x ELSE IF a$ >= "0" OR a$ <= "9" THEN passcd$ = passcd$ + a$ LOCATE q, 18 + x PRINT "*"; x = x + 1 END IF END IF LOOP IF VAL(passcd$) <> pass THEN GOTO nd END IF PRINT "Re-Booting NOW!" CALL Int86Old(inter, inRegs(), outregs()) nd: END password: IF passwd = 1 THEN l = CSRLIN + 1 LOCATE l, 1 PRINT "Input Password:"; pas$ = "" in$ = "" DO UNTIL in$ = CHR$(13) in$ = INKEY$ IF in$ = CHR$(13) OR in$ = "" THEN GOTO nextbit pas$ = pas$ + in$ PRINT "*"; nextbit: LOOP PRINT pas$ = UCASE$(pas$) LOCATE l, 1 PRINT " " IF pas$ <> pass$ THEN RETURN END IF IF passcd = 1 THEN passcd$ = "" q = CSRLIN + 2 IF q > 22 THEN q = 1: CLS LOCATE q, 1 PRINT "Enter Passcode : "; x = 1 DO UNTIL x = 5 SLEEP a$ = INKEY$ IF a$ = CHR$(8) AND x > 1 THEN x = x - 1 passcd$ = LEFT$(passcd$, (LEN(passcd$) - 1)) LOCATE q, 18 + x PRINT " "; LOCATE q, 18 + x ELSE IF a$ >= "0" OR a$ <= "9" THEN passcd$ = passcd$ + a$ LOCATE q, 18 + x PRINT "*"; x = x + 1 END IF END IF LOOP IF VAL(passcd$) <> pass THEN LOCATE q, 1: PRINT " ": RETURN END IF GOTO nd: brk: y = CSRLIN - 1 x = POS(0) LOCATE 22, 1 PRINT " " LOCATE 22, 1 PRINT "You pressed Ctrl-Break! Do NOT do it again!" LOCATE y, x RETURN ctrldel: y = CSRLIN - 1 x = POS(0) LOCATE 22, 1 PRINT " " LOCATE 22, 1 PRINT "You pressed Ctrl-Alt-Delete! In a Re-Boot program? Really!" LOCATE y, x RETURN