Windows驱动开发学习记录-驱动中快速重启关闭计算机之二

  • 前言

        之前在《Windows驱动开发学习记录-驱动中快速重启关闭计算机之一》中使用Windows内核函数进行快速重启和关机,这次使用更快速直接的IO端口操作来进行。这里做个总结,分析可见参考资料1、2。

一、IO92h(重启)

 1、Intel文档(Page445):

2、AMD文档(Page676):

3、实现

    mov al,	1h
	mov dx,	092h
	out	dx,	al

二、IO64h(重启)

1、AMD文档(Page667):

2、实现

    mov al,	0feh
	mov dx,	064h
	out	dx,	al

三、IO0CF9(重启和关闭)

 1、Intel文档(Page446):

2、AMD文档(Page684):

 3、实现

        重启:

    mov al,	06h
	mov dx,	0cf9h
	out	dx,	al

        关闭:(该实现依赖于硬件的作法,在本人虚拟机XP 32位、Win7 x64、Win7 x86下表现为重启,在一台x58主板的物理上表现为断电5秒后又启动,而在新的笔记本上UEFI主板加Win10 x64的环境下可以实现秒关机

    mov al,	0eh
	mov dx,	0cf9h
	out	dx,	al

四、 代码实现的选择

        在每种方法中的后边都使用的汇编代码,因为读写端口数据用到 in和out指令。但本人编译驱动时使用的是VS2019,不支持内联汇编,所以可以使用WRITE_PORT_UCHAR来实现,例如最后一个:

PUSHORT nPort = (PUSHORT)0xCF9;
USHORT nData = 0x6;
WRITE_PORT_USHORT(nPort, nData);

        不过在VS2019中可以把实现写成一个汇编asm文件,然后链接时直接调用具体的实现。

五、最终实现

Implementation.asm文件

ifndef  X64
.model  FLAT,STDCALL
endif


.const  
RESET_BY_092_PORT                DW				092H
RESET_BY_092_CODE                DB				01H
RESET_BY_0CF9_PORT               DW				0CF9H
RESET_BY_0CF9_CODE               DB				06H
RESET_BY_I8042_PORT              DW				64H
RESET_BY_I8042_CODE              DB				0FEH
POWEROFF_BY_0CF9_PORT            DW				0CF9H
POWEROFF_BY_0CF9_CODE            DB				0EH

.data 

.code

ComputerResetByPort092 proc
    mov al, RESET_BY_092_CODE
    mov dx, RESET_BY_092_PORT
    out dx, al
    jmp $
ComputerResetByPort092 endp

ComputerResetByPort0CF9 proc
    mov al, RESET_BY_0CF9_CODE
    mov dx, RESET_BY_0CF9_PORT
    out dx, al
    jmp $
ComputerResetByPort0CF9 endp

ComputerResetByI8042 proc
    mov al, RESET_BY_I8042_CODE
    mov dx, RESET_BY_I8042_PORT
    out dx, al
    jmp $
ComputerResetByI8042 endp

ComputerPowerOffByPort0CF9 proc
    mov al, POWEROFF_BY_0CF9_CODE
    mov dx, POWEROFF_BY_0CF9_PORT
    out dx,  al
    jmp $
ComputerPowerOffByPort0CF9 endp

end

.h文件

EXTERN_C VOID ComputerResetByPort092();
EXTERN_C VOID ComputerResetByPort0CF9();
EXTERN_C VOID ComputerResetByI8042();
EXTERN_C VOID ComputerPowerOffByPort0CF9();

.cpp文件

EXTERN_C NTSTATUS  DriverEntry(PDRIVER_OBJECT pDriverObject,
        PUNICODE_STRING pRegistryPath)
{
        NTSTATUS ntStatus = STATUS_SUCCESS;
        
        //ComputerResetByPort092();
        //ComputerResetByPort0CF9();
        //ComputerResetByI8042();
        ComputerPowerOffByPort0CF9();
        
        return ntStatus;
}

 参考资料:

1. 《我的内核学习笔记13:x86平台linux系统重启流程跟踪》: 我的内核学习笔记13:x86平台linux系统重启流程跟踪_李迟的专栏-CSDN博客

2.《NP的重启代码(记录备份)!》:NP的重启代码(记录备份)!_HexBug-CSDN博客_重启记录代码

3.《Intel® IO Controller Hub 10 (ICH10) Family》:https://www.intel.com/content/www/us/en/io/io-controller-hub-10-family-datasheet.html

4.《BIOS and Kernel Developer’s Guide (BKDG) for AMD Family 15h Models 70h-7Fh Processors》:Developer Guides, Manuals & ISA Documents - AMD

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值