-
前言
之前在《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