mechling@secola.Columbia.NCR.COM (Randy Mechling) (06/07/90)
I am trying to do a warm reboot (such as CTL-ALT-DEL) from within an assembly module. Can anyone suggest a means of doing this. I would prefer to do this in assembly as I want to call it as what Novell calls an Event Service Routine. Please email me any suggestions. Thanks
bobmon@iuvax.cs.indiana.edu (RAMontante) (06/07/90)
Here are some articles I scarfed a few years ago, on this subject. Nostalgia alert: one of the return addresses here is ihnp4... ________________________ { Three articles about warm-reboot vectors, culminating in debug scripts and a MASM assembler listing to do the dirty deed } 1} Article 1899 of comp.sys.ibm.pc: Subject: Re: Code to perform warm reboot. Date: 22 Feb 87 20:26:01 GMT From: jmh@hyper.UUCP (Joel Halpern) Organization: Network Systems Corp., Mpls. MN Summary: Warm Boot and Extended Memory <1442@bnrmtv.UUCP>, zarifes@bnrmtv.UUCP (Kenneth Zarifes) : > > I almost forgot, the best way to do a warm reboot is to move the value 1234H > into the location 0040:0072 and THEN jump to F000:FFF0 > > You'll find that this works on clones, AT's, PC's and about everything else. I believe that this machanism is used internally in DOS. Specifically, on the AT, there are DOS routines for manipulating extended memory. These routines switch into protected mode to get to the memory they want. However, the only way out of protected mode is a hardware reset. In order to avoid the memory checks and delays on the reset, the magic number is stored at 0040:0072 to control the restart process. Joel M. Halpern -- Network Systems Corporation ihnp4!umn-cs!hyper!jmh 2} Date: Mon, 16 Feb 87 15:27:48 EST From: John.Brennen@VI.RI.CMU.EDU Subject: Reboot In order to reboot a PC, PC clone, PC compatible or whatever, you can use the following code (to make a .COM file, cut the text between the lines into a file, say "foo.bar", and on a PC, run "debug < foo.bar"). ---------------------------------------- a100 xor ax,ax mov ds,ax mov [472],wo 1234 jmp ffff:0 nreboot.com rcx f w q ---------------------------------------- The storage of 1234 in absolute memory location 00472 avoids the memory check. If you have an AT, AT clone, AT compatible or whatever, you can pulse the RESET line through software control: ---------------------------------------- a100 xor ax,ax mov ds,ax mov [472],wo 1234 mov al,fe out 64,al jmp 10e nreboot.com rcx 10 w q John Brennen CMU Visual Inspection Lab jfb@vi.ri.cmu.edu Pittsburgh, PA ------------------------------ 3} Date: 02/18/87 17:06:06 GMT+1 From: UF02%DDAGSI3.BITNET@wiscvm.wisc.edu Subject: REBOOT Program and 640K Limit Frank Schwab 069/798-8238 Institut fuer theoretische Physik Robert-Mayer-Str. 10 D-6000 Frankfurt/M. This letter is to answer a question in Info-IBMPC V6 #9 and to correct a common misunderstanding I want to make clear. First I want to answer the question of Scott Hutchinson: "How do I reboot?". This is not a complicated task. You just have to jump to where the 80x86 jumps after a hardware reset. This is location 'F000:FFF0'. But if you just use a 'JMP' instruction you'll have to go through all the memory testing. Therefore the BIOS designers put a small trap door into the BIOS. Place the value '1234H' into the RESET_FLAG location at '40:72' and when the BIOS gets control and finds that value it skips the memory tests. The whole program can be debuged into the PC very easily. Put the following debug commands which are surrounded by the 'Cut here' marks into a file called 'reset.dbg' and then start DEBUG with 'debug < reset.dbg'. (Please note that the blank line after 'JMP F000:FFF0' is mandatory!). This will create a file 'reset.com' which does the resetting. (Check this by typing 'reset' at the DOS command level but save your previous work before). Those of you which don't want to save the way they created the program can also type the commands directly after calling DEBUG. ---- Cut here ---- (begin) N RESET.COM A MOV AX,40 MOV DS,AX MOV WORD PTR [72],1234 JMP F000:FFF0 R CX 10 W Q ---- Cut here ---- (end) If you want it a bit more complete you can also use the following assembly program and build it together with: MASM RESET; LINK RESET; EXE2BIN RESET RESET.COM The program is again surrounded by 'Cut here' marks: ---- Cut here ---- (begin) PAGE 65,130 TITLE RESET --- Requests a System Reset (Ctrl+Alt+Del) ;********************************************************************** ;* R E S E T V3.01 * ;********************************************************************** ;* * ;* RESET jumpes to the 80x86-reset-location (F000:FFF0) to perform * ;* a system reset. Before there is placed a special value into the * ;* RESET_FLAG (40:72) to indicate that this is a software reset. This * ;* will cause a shorter reset sequence on all IBM-PCs and will also * ;* reset all other 80x86-machines. The method of using INT 19H to * ;* reboot has been discarded because it does not reset the interrupts * ;* which causes failure at restart because DOS-resident programs have * ;* been cleared but the corresponding vectors have not. * ;* * ;* ---- This program is hereby donated to the public domain. ---- * ;* ---- (I know that this is not too much of a donation.) ---- * ;* * ;********************************************************************** ;* * ;* Author : Frank Schwab * ;* Start : 16 May 1986 * ;* Last Modification : 11 Jun 1986 * ;* * ;* Buildup : MASM RESET; * ;* LINK RESET; * ;* EXE2BIN RESET RESET.COM * ;* * ;********************************************************************** ;* * ;* Syntax: RESET * ;* * ;********************************************************************** ;* BIOS_DATA_SEGMENT SEGMENT AT 0040H ORG 0072H RESET_FLAG EQU THIS WORD BIOS_DATA_SEGMENT ENDS BIOS_CODE_SEGMENT SEGMENT AT 0F000H ORG 0FFF0H RESET_ADDR LABEL FAR ;80x86-Reset addr. BIOS_CODE_SEGMENT ENDS CSEG SEGMENT 'CODE' ASSUME CS:CSEG,DS:BIOS_DATA_SEGMENT,ES:NOTHING,SS:CSEG ORG 0100H RESET: MOV AX,SEG BIOS_DATA_SEGMENT ;Signal that this is MOV DS,AX ;a keyboard reset. MOV RESET_FLAG,1234H JMP BIOS_CODE_SEGMENT:RESET_ADDR ;O.k., do it WHO DB 'RESET V3.01 11 Jun 1986 Frank Schwab' CSEG ENDS END RESET ---- Cut here ---- (end)