reboot.c

来自「一个类似windows」· C语言 代码 · 共 72 行

C
72
字号
/* $Id: reboot.c 21261 2006-03-08 23:26:25Z audit $
 *
 * COPYRIGHT:       See COPYING in the top level directory
 * PROJECT:         ReactOS kernel
 * FILE:            ntoskrnl/hal/x86/reboot.c
 * PURPOSE:         Reboot functions.
 * PROGRAMMER:      Eric Kohl (ekohl@abo.rhein-zeitung.de)
 * UPDATE HISTORY:
 *                  Created 11/10/99
 */

#include <hal.h>
#define NDEBUG
#include <debug.h>


static VOID
HalReboot (VOID)
{
    char data;
    extern PVOID HalpZeroPageMapping;

    /* enable warm reboot */
    ((PUCHAR)HalpZeroPageMapping)[0x472] = 0x34;
    ((PUCHAR)HalpZeroPageMapping)[0x473] = 0x12;

    /* disable interrupts */
    Ki386DisableInterrupts();


    /* disable periodic interrupt (RTC) */
    WRITE_PORT_UCHAR((PUCHAR)0x70, 0x0b);
    data = READ_PORT_UCHAR((PUCHAR)0x71);
    WRITE_PORT_UCHAR((PUCHAR)0x71, (UCHAR)(data & 0xbf));

    /* */
    WRITE_PORT_UCHAR((PUCHAR)0x70, 0x0a);
    data = READ_PORT_UCHAR((PUCHAR)0x71);
    WRITE_PORT_UCHAR((PUCHAR)0x71, (UCHAR)((data & 0xf0) | 0x06));

    /* */
    WRITE_PORT_UCHAR((PUCHAR)0x70, 0x15);

    /* generate RESET signal via keyboard controller */
    WRITE_PORT_UCHAR((PUCHAR)0x64, 0xfe);

    /* stop the processor */
#if 1
    Ki386HaltProcessor();
    for(;;);
#endif   
}


VOID STDCALL
HalReturnToFirmware (
	FIRMWARE_REENTRY	Action
	)
{
    if (Action == HalHaltRoutine)
    {
        DbgPrint ("HalReturnToFirmware called!\n");
        DbgBreakPoint ();
    }
    else if (Action == HalRebootRoutine)
    {
        HalReboot ();
    }
}

/* EOF */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?