| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> Windows驱动开发学习记录-驱动中快速重启关闭计算机之一 -> 正文阅读 |
|
[开发工具]Windows驱动开发学习记录-驱动中快速重启关闭计算机之一 |
? ? ? ? 关于快速重启和关闭计算机,网上有不少软件在Ring3下调用ZwShutdownSystem (NtShutdownSystem)来实现,虽然速度很快,但还至少经历一些流程,比如向设备驱动发送停机通知等。以下内容摘自<<深入解析Windows操作系统?第6版(下册)>>? P528:
? ? ? ? ?可以看到调用NtShutdownSystem还有不少处理的东西,所以我在想能不能调用更底层的实现来更快速的关机。 ????????再者有些防止关机的程序也是Hook了NtShutdownSystem,我们想办法用更底层的实现可以绕过Hook,不过话说已经在内核层驱动了,有啥不能干的呢^_^。
? ? ? ? 下面的分析主要采用ReactOS、WindowsXP的代码以及Windbg调试:
? ? ? ? 这里调试的是NtSetSystemPowerState,再来看看NtSetSystemPowerState的实现(截取主要内容),可以看出最终调用PopGracefulShutdown
? ? ? ? 接着再看PopGracefulShutdown,可以看到这里也做了很多,IO管理器的关闭,配置管理器的关闭,缓存管理器的关闭等。在这里修改的文件、注册表等信息将被写到磁盘。最终调用PopShutdownSystem
? ? ? ? 接着看?PopShutdownSystem,可以看出最终调用的是HalReturnToFirmware
? ? ? ? 最终调用的是HalpReboot,在xp上,HalpReboot处理一些CMOS数据和PCI数据,就不再深入分析了。 ? ? ? ? WinXP下FIRMWARE_ENTRY?定义如下? ? ??
????????HalReturnToFirmware也是我们可调用的最底层接口,因为它是导出的,可以在驱动中直接使用。 ? ? ? ? 在Win7 x64环境下Windbg反汇编的结果如下,跳转逻辑已用颜色标记出来 1: kd> uf hal!HalReturnToFirmware hal!HalReturnToFirmware: fffff800`05412d68 48895c2408 mov qword ptr [rsp+8],rbx fffff800`05412d6d 55 push rbp fffff800`05412d6e 4883ec20 sub rsp,20h fffff800`05412d72 bd01000000 mov ebp,1 fffff800`05412d77 85c9 test ecx,ecx fffff800`05412d79 7422 je hal!HalReturnToFirmware+0x35 (fffff800`05412d9d) ????????//传入的参数为0 hal!HalReturnToFirmware+0x13: fffff800`05412d7b 3bcd cmp ecx,ebp fffff800`05412d7d 7419 je hal!HalReturnToFirmware+0x30 (fffff800`05412d98)????????//传入的参数为1,跳转到hal!HalpShutdown hal!HalReturnToFirmware+0x17: fffff800`05412d7f 7e05 jle hal!HalReturnToFirmware+0x1e (fffff800`05412d86)???????//传入小于0的数值,非法????? hal!HalReturnToFirmware+0x19: fffff800`05412d81 83f903 cmp ecx,3 fffff800`05412d84 7e17 jle hal!HalReturnToFirmware+0x35 (fffff800`05412d9d)????????//传入的参数小于等于3,也就是2和3时 hal!HalReturnToFirmware+0x1e: fffff800`05412d86 488d0d13400100 lea rcx,[hal! ?? ::FNODOBFM::`string' (fffff800`05426da0)] fffff800`05412d8d e84e350100 call hal!DbgPrint (fffff800`054262e0) fffff800`05412d92 cc int 3 fffff800`05412d93 e9ca000000 jmp hal!HalReturnToFirmware+0xfa (fffff800`05412e62) hal!HalReturnToFirmware+0x30: fffff800`05412d98 e8cb010000 call hal!HalpShutdown (fffff800`05412f68) hal!HalReturnToFirmware+0x35: fffff800`05412d9d ff1555550100 call qword ptr [hal!_imp_InbvAcquireDisplayOwnership (fffff800`054282f8)] fffff800`05412da3 4533c0 xor r8d,r8d fffff800`05412da6 8bd5 mov edx,ebp fffff800`05412da8 33c9 xor ecx,ecx fffff800`05412daa e895230000 call hal!HalpMapPhysicalMemory64 (fffff800`05415144) fffff800`05412daf 4885c0 test rax,rax fffff800`05412db2 740c je hal!HalReturnToFirmware+0x58 (fffff800`05412dc0) hal!HalReturnToFirmware+0x4c: fffff800`05412db4 b934120000 mov ecx,1234h fffff800`05412db9 66898872040000 mov word ptr [rax+472h],cx hal!HalReturnToFirmware+0x58: fffff800`05412dc0 b9e8030000 mov ecx,3E8h fffff800`05412dc5 e8867bffff call hal!HalpAcquireCmosSpinLockEx (fffff800`0540a950) fffff800`05412dca fa cli fffff800`05412dcb 803d33f6010000 cmp byte ptr [hal!HalpTimeSourceInitializationComplete (fffff800`05432405)],0 fffff800`05412dd2 750d jne hal!HalReturnToFirmware+0x79 (fffff800`05412de1) hal!HalReturnToFirmware+0x6c: fffff800`05412dd4 ba64000000 mov edx,64h fffff800`05412dd9 b0fe mov al,0FEh fffff800`05412ddb ee out dx,al fffff800`05412ddc e981000000 jmp hal!HalReturnToFirmware+0xfa (fffff800`05412e62) hal!HalReturnToFirmware+0x79: fffff800`05412de1 ba70000000 mov edx,70h fffff800`05412de6 b00b mov al,0Bh fffff800`05412de8 ee out dx,al fffff800`05412de9 8bcd mov ecx,ebp fffff800`05412deb e8085b0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412df0 ba71000000 mov edx,71h fffff800`05412df5 ec in al,dx fffff800`05412df6 8ad8 mov bl,al fffff800`05412df8 8bcd mov ecx,ebp fffff800`05412dfa e8f95a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412dff 80e3bf and bl,0BFh fffff800`05412e02 ba71000000 mov edx,71h fffff800`05412e07 8ac3 mov al,bl fffff800`05412e09 ee out dx,al fffff800`05412e0a 8bcd mov ecx,ebp fffff800`05412e0c e8e75a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412e11 ba70000000 mov edx,70h fffff800`05412e16 b00a mov al,0Ah fffff800`05412e18 ee out dx,al fffff800`05412e19 8bcd mov ecx,ebp fffff800`05412e1b e8d85a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412e20 ba71000000 mov edx,71h fffff800`05412e25 ec in al,dx fffff800`05412e26 8ad8 mov bl,al fffff800`05412e28 8bcd mov ecx,ebp fffff800`05412e2a e8c95a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412e2f 80e3f6 and bl,0F6h fffff800`05412e32 ba71000000 mov edx,71h fffff800`05412e37 80cb06 or bl,6 fffff800`05412e3a 8ac3 mov al,bl fffff800`05412e3c ee out dx,al fffff800`05412e3d 8bcd mov ecx,ebp fffff800`05412e3f e8b45a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412e44 ba70000000 mov edx,70h fffff800`05412e49 b015 mov al,15h fffff800`05412e4b ee out dx,al fffff800`05412e4c 8bcd mov ecx,ebp fffff800`05412e4e e8a55a0000 call hal!KeStallExecutionProcessor (fffff800`054188f8) fffff800`05412e53 e880a30000 call hal!HalpResetAllProcessors (fffff800`0541d1d8) fffff800`05412e58 e8d3010000 call hal!HalpWriteResetCommand (fffff800`05413030) fffff800`05412e5d e84e390100 call hal!HalpHalt (fffff800`054267b0) hal!HalReturnToFirmware+0xfa: fffff800`05412e62 488b5c2430 mov rbx,qword ptr [rsp+30h] fffff800`05412e67 4883c420 add rsp,20h fffff800`05412e6b 5d pop rbp fffff800`05412e6c c3 ret ? ? ? ? Win7 x64位下逻辑有所改变,从hal!HalReturnToFirmware+0x79?开始其实就为XP下HalpReboot的具体实现。
? ? ? ? 综上所述,代码实现就比较简单了: 头文件定义
实现
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 4:17:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |