从Windows到Bios的桥梁:Windbg跟踪Win7开启ACPI

Tracking ACPI/ASL Using WinDbg Tracking ACPI/ASL Using WinDbg 1. Preface       ACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。   阅读详情
点击上方蓝色“终端研发部”,选择“设为星标”
学最好的别人,做最好的我们

本文为看雪论坛优秀文章

看雪论坛作者ID:hyjxiaobia

由于windows设备驱动程序被设计成以设备堆栈(Device stack)的形式,下层驱动向上提供支持,所以我们习惯于不加思考的在设备栈的上层使用来自下层驱动的各种已有功能。当我还在做驱动程序时,经常见到这些句话:

A1."功能驱动(Fdo)收到IRP_MJ_PNP&IRP_MN_START后,会向总线驱动(Pdo)查询并正确配置所需的硬件资源,如IO Port/IRQ/Mem等,然后才开始工作"。

这段话我一直感到困惑:功能驱动的硬件资源来自总线驱动,那么总线驱动的资源由谁提供?可能有人会这样释疑:由物理总线仲裁分配。

A2."设备驱动从D0进入D3,保存设备上下文以后,设备(特指硬件上的设备)将进入D3 Sleep状态"。

这段话就更困惑了,为什么保存设备上下文(往往是驱动层面上的上下文)后,硬件就能下电了?

A3.OS进入Sleep后,当支持唤醒功能的设备收到中断信号后,唤醒OS。其实,进入Sleep状态后,CPU不会运行任何指令,OS和驱动程序不可能执行;另外,OS作为驱动程序的载体,不可能驱动程序先于OS提前醒来并唤醒OS的情况(驱动程序在梦游?)。

那么,所谓的驱动程序Wakeup功能又是指什么?

    

上面有些问题看似很难有答案,另一些问题的答案又回答的很模糊,像是顺着设备堆栈的思路,把问题抛给更底层。

这种不能释怀的情绪伴随了很多年(我简直是带着问题工作!),直到我转做Bios一段时间,并无意中得到xp泄露的源码后,我觉得我可能释疑了。所以打算用几篇文章输出一下自己的观点。

本文暂不回答上面3个问题,只用于引入文章的主角----作为沟通OS和Bios的桥梁,ACPI.sys(它是windows对ACPI spec中反复出现的OSPM的平台实现)。windows通过ACPI.sys,借助BIOS的实现上述功能A1/A2;GPIO信号跳变后,触发SCI中断,引起Bios执行平台唤醒功能,并在此过程中重新加载OS,最终实现上述功能A3。

ACPI如此重要,值得我们好好研究。本文从两个侧面介绍win7 x86上开启ACPI的过程:Bios侧和windows侧。


Part 1. Bios侧对开启ACPI的支持

根据ACPI spec(Version 6.2),FADT表中的SMI_CMD和ACPI_ENABLE与ACPI开启有关:

如spec所述,Bios在初始化过程中配置完包含SMI_CMD和ACPI_ENABLE(重点强调,这是Bios设置的,相当于提供给OS的接口。对于同一台机器不论装什么OS,这个值是固定的)的整个ACPI table,然后加载到内存。

OS在引导过程中会向SMI_CMD指定的端口写入ACPI_ENABLE设定的值,触发SMI中断;SMI中断触发后会进入Bios的SMM Handler,由Bios执行开启ACPI所需的设置。到vm上看下这两项的设置:

SMI_CMD是0xB2,这是一个特殊值,Intel PCH spec上对这个端口有详细说明:当APMC_En bit enable后,往APM_CNT,就是RW中的0xB2写入数值就会引起SMI中断。下面截图选自Intel PCH spec:


UEFI框架中会用下列形式注册SMI Handler,当往0xB2端口写入SwSmiInputValue时,就会触发SMI中断,并执行SMI处理函数EnableAcpiCallback(附注,SMI处理函数的运行对于OS而言是透明的,这句话读者自己细品)

  SwContext.SwSmiInputValue = (UINTN) PcdGet8 (PcdAcpiEnableSwSmi);
  Status = SwDispatch->Register (
                         SwDispatch,
                         EnableAcpiCallback,
                         &SwContext,
                         &SwHandle
                         );

同理,Bios为了支持windows开启ACPI,也会以同样的方式注册SMI处理函数。对于VMware,它注册的值是0xF0,注册后,往ACPI table Fadt->ACPI_Enable域写入0xF0,之后默默的等windows开启ACPI。


新Part 2. Windows侧开启ACPI

debug前的准备工作:

bcdedit /debug on
bcdedit /bootdebug on ;不开这个,windows开启ACPI的瞬间,windbg和目标机的调试会话可能会被重置

根据泄露的windows xp源码,可以发现Xp时代,开启ACPI的相关代码位于ACPIEnableEnterACPIMode 函数中:

//busdrv\acpi\driver\shared\acpienbl.c
VOID
ACPIEnableEnterACPIMode (
    VOID
    );
/*++
Routine Description:
    This routine is called to enter ACPI mode
Arguments:
    None
Return Value:
    None
--*/

不过这段代码来自Xp,我们调试的目标是win7,调试前得先确认下这部分代码是否存在变化:

kd>x ACPI!ACPIEnableEnterACPIMode ;搜索函数名
ACPI!ACPIEnableEnterACPIMode      ;居然函数还在,看来Win7还是用这个函数开启ACPI
kd> bp acpi!ACPIEnableEnterACPIMode ;那就下断点
kd> g
Breakpoint 0 hit
ACPI!ACPIEnableEnterACPIMode:
88cdbce0 8bff            mov     edi,edi

当触发断点后,看下调用堆栈等信息,可以看出此时OS处于初始化Phase1阶段。

kd> g
Breakpoint 0 hit
ACPI!ACPIEnableEnterACPIMode:
88cc2ce0 8bff            mov     edi,edi
kd> kb
 # ChildEBP RetAddr  Args to Child              
00 8078b644 88cc2e25 00000000 8078b66c 88cfde24 ACPI!ACPIEnableEnterACPIMode
01 8078b650 88cfde24 00000000 82a0f940 88cf5ae0 ACPI!ACPIEnableInitializeACPI+0x1f
02 8078b66c 88cbe556 87d4cc60 87e548a0 00000000 ACPI!ACPIInitialize+0xe2
03 8078b69c 88d050c2 87d4cc60 886e81a0 88d04f38 ACPI!ACPIInitStartACPI+0x6a
04 8078b6c8 88cb927e 87d4cc60 886e8100 87d4cc60 ACPI!ACPIRootIrpStartDevice+0x18a
05 8078b6f8 82a7c11a 87d4cc60 87e548a0 886e8258 ACPI!ACPIDispatchIrp+0x13a
06 8078b718 82f8f531 00000000 87e535d8 87d4b008 nt!IofCallDriver+0x7e
07 8078b734 82a89506 8078b76c 82a892ea 87d4e4a0 nt!PnpAsynchronousCall+0x109
08 8078b7a0 82f976be 82a892ea 87d4e4a0 00000000 nt!PnpStartDevice+0x184
09 8078b7fc 82f96b27 00000012 00000000 87d4e4a0 nt!PnpStartDeviceNode+0x2a6
0a 8078b818 82f8b0b8 00000000 00000000 00000000 nt!PipProcessStartPhase1+0x87
0b 8078ba14 82a87f83 87df5748 00000000 8078ba50 nt!PipProcessDevNodeTree+0x1cc
0c 8078ba5c 82a87e4a 00000000 87d4cab8 00000000 nt!PnpDeviceActionWorker+0x129
0d 8078ba74 832b06ba 00000000 00000000 00000000 nt!PnpRequestDeviceAction+0x15e
0e 8078baec 832ad52b 8080f8c0 00000000 80810e50 nt!IopInitializeBootDrivers+0x414
0f 8078bb6c 832a29b7 8080f8c0 87de25e0 87de2270 nt!IoInitSystem+0x593
10 8078bc4c 82ecd012 8078bc90 8313d0da 8080f8c0 nt!Phase1InitializationDiscard+0xd67
11 8078bc54 8313d0da 8080f8c0 0010209f 00000000 nt!Phase1Initialization+0xd
12 8078bc90 82be6555 82ecd005 8080f8c0 00000000 nt!PspSystemThreadStartup+0x178
13 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19

另外,调用堆栈Frame#06有个熟悉的函数调用:IofCallDriver,参数显示的DeviceInst:ACPI_HAL\PNP0C08,它就是ACPI spec中指定ACPI.sys(OSPM)。

kd> !devstack 87e535d8 
  !DevObj   !DrvObj            !DevExt   ObjectName
  87d4cc60  \Driver\ACPI       87e548a0  
> 87e535d8  \Driver\ACPI_HAL   87e53690  0000006c
!DevNode 87d4b008 :
  DeviceInst is "ACPI_HAL\PNP0C08\0"  ;<---PNP0C08
  ServiceName is "ACPI"


继续往下调试,会看到OS从全局变量ACPI!AcpiInformation+0x04处获得信息,感觉ACPI!AcpiInformation是个结构体指针:

kd> p
ACPI!ACPIEnableEnterACPIMode+0x81:
88cdbd61 a194bbd088      mov     eax,dword ptr [ACPI!AcpiInformation (88d0bb94)]
  
kd> u ACPI!ACPIEnableEnterACPIMode+0x81
8bf8            mov     edi,eax
a1942bcf88      mov     eax,dword ptr [ACPI!AcpiInformation (88cf2b94)]
8b4004          mov     eax,dword ptr [eax+4] ;<---从结构体偏移取值
660fb64034      movzx   ax,byte ptr [eax+34h] ;<---ACPI!AcpiInformation+4处取得的值仍然是结构体指针
0fb7c0          movzx   eax,ax

ACPI!AcpiInformation结构体长成什么样,dump出来看一下?

顺带一提,dt的输出结果中,从ACPI!_ACPIInformation!PM1a_BLK开始到ACPI!_ACPIInformation!GpeSize都是ACPI spec中定义的Fixed Hardware Register。

kd> dt _ACPIInformation
ACPI!_ACPIInformation
   +0x000 RootSystemDescTable : Ptr32 _RSDT_32
   +0x004 FixedACPIDescTable : Ptr32 _FADT
   +0x008 FirmwareACPIControlStructure : Ptr32 _FACS
   +0x00c DiffSystemDescTable : Ptr32 _DSDT
   +0x010 MultipleApicTable : Ptr32 _MAPIC
   +0x014 GlobalLock       : Ptr32 Uint4B
   +0x018 GlobalLockQueue  : _LIST_ENTRY
   +0x020 GlobalLockQueueLock : Uint4B
   +0x024 GlobalLockOwnerContext : Ptr32 Void
   +0x028 GlobalLockOwnerDepth : Uint4B
   +0x02c ACPIOnly         : UChar
   +0x030 PM1a_BLK         : Uint4B
   +0x034 PM1b_BLK         : Uint4B
   +0x038 PM1a_CTRL_BLK    : Uint4B
   +0x03c PM1b_CTRL_BLK    : Uint4B
   +0x040 PM2_CTRL_BLK     : Uint4B
   +0x044 PM_TMR           : Uint4B
   +0x048 GP0_BLK          : Uint4B
   +0x04c GP0_ENABLE       : Uint4B
   +0x050 GP0_LEN          : UChar
   +0x052 Gpe0Size         : Uint2B
   +0x054 GP1_BLK          : Uint4B
   +0x058 GP1_ENABLE       : Uint4B
   +0x05c GP1_LEN          : UChar
   +0x05e Gpe1Size         : Uint2B
   +0x060 GP1_Base_Index   : Uint2B
   +0x062 GpeSize          : Uint2B
   +0x064 SMI_CMD          : Uint4B
   +0x068 pm1_en_bits      : Uint2B
   +0x06a pm1_wake_mask    : Uint2B
   +0x06c pm1_wake_status  : Uint2B
   +0x06e c2_latency       : Uint2B
   +0x070 c3_latency       : Uint2B
   +0x074 ACPI_Flags       : Uint4B
   +0x078 ACPI_Capabilities : Uint4B
   +0x07c Dockable         : UChar

再dump出ACPI!AcpiInformation->FixedACPIDescTable的内存,可以发现,其中smi_cmd_io_port/acpi_on_value的值和前面RW截图中显示的值一致。

kd> dx -id 0,0,ffffffff87de2548 -r1 ((ACPI!_FADT *)0xffd07010)
((ACPI!_FADT *)0xffd07010)                 : 0xffd07010 [Type: _FADT *]
    [+0x000] Header           [Type: _DESCRIPTION_HEADER]
    [+0x024] facs             : 0x3fefffc0 [Type: unsigned long]
    [+0x028] dsdt             : 0x3fee1652 [Type: unsigned long]
    [+0x02c] int_model        : 0x0 [Type: unsigned char]
    [+0x02d] pm_profile       : 0x0 [Type: unsigned char]
    [+0x02e] sci_int_vector   : 0x9 [Type: unsigned short]
    [+0x030] smi_cmd_io_port  : 0xb2 [Type: unsigned long]   ;<---SMI_CMD
    [+0x034] acpi_on_value    : 0xf0 [Type: unsigned char]   ;<---ACPI_ENABLE
    [+0x035] acpi_off_value   : 0xf1 [Type: unsigned char]

之后,继续跟踪代码运行,Windows通过调用WRITE_ACPI_REGISTER,往0xB2写入0xf0,触发SMI中断,调用前面提到的Bios Smi Handler,在硬件上开启ACPI。

注意WRITE_ACPI_REGISTER是个宏定义,其实现如下。

//busdrv\acpi\driver\shared\acpiio.h
#define WRITE_ACPI_REGISTER(AcpiReg, Register, Value) ((*AcpiWriteRegisterRoutine)((AcpiReg), (Register), (Value)))
  
//busdrv\acpi\driver\shared\acpiio.c:
PWRITE_ACPI_REGISTER AcpiWriteRegisterRoutine = DefWriteAcpiRegister;

换言之,Windows通过调用是DefWriteAcpiRegister来写0xB2寄存器,下面代码段我只贴出和SMI_CMD相关的代码:

VOID
DefWriteAcpiRegister(
    ACPI_REG_TYPE AcpiReg,
    ULONG Register,
    USHORT Value
    )
/*++
  
Routine Description:
  
    Write to the specified ACPI fixed register.
  
Arguments:
  
    AcpiReg - Specifies which ACPI fixed register to write to.
  
    Register - Specifies which GP register to write to. Not used for PM1x
               registers.
  
    Value - Data to write.
  
Return Value:
  
    None.
  
--*/
{
    switch (AcpiReg) {
..
        case SMI_CMD:
            WRITE_PORT_UCHAR((PUCHAR)AcpiInformation->SMI_CMD, (UCHAR)Value);
            break;
  
        default:
            break;
    }
}

至此,我们已经开启了ACPI的大门。

BAT等大厂Java面试经验总结 想获取 Java大厂面试题学习资料扫下方二维码回复「BAT」就好了回复 【加群】获取github掘金交流群回复 【电子书】获取2020电子书教程回复 【C】获取全套C语言学习知识手册回复 【Java】获取java相关的视频教程和资料回复 【爬虫】获取SpringCloud相关多的学习资料回复 【Python】即可获得Python基础到进阶的学习教程回复 【idea破解】即可获得intellij idea相关的破解教程回复 【BAT】即可获得intellij idea相关的破解教程关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!


回复 【idea激活】即可获得idea的激活方式

回复 【Java】获取java相关的视频教程和资料

回复 【SpringCloud】获取SpringCloud相关多的学习资料

回复 【python】获取全套0基础Python知识手册

回复 【2020】获取2020java相关面试题教程

回复 【加群】即可加入终端研发部相关的技术交流群

阅读更多

为什么HTTPS是安全的

因为BitMap,白白搭进去8台服务器...

《某厂内部SQL大全 》.PDF

字节跳动一面:i++ 是线程安全的吗?

大家好,欢迎加我微信,很高兴认识你!

在华为鸿蒙 OS 上尝鲜,我的第一个“hello world”,起飞!

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!


喜欢就给个“在看”

windbg - 查看函数地址 有时候需要查看函数地址,官方地址https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/x--examine-symbols- 示例:x /D /f lec_teacher!c* 以下命令将查找 MyModule 中包含字符串 "spin" 的所有符号。 0:000> x mymodule!*spin* 以下命令快速查找 MyModule 中的 "DownloadMinor" 和 "Downloa.. 阅读详情

相关推荐

操作系统里ACPI的硬件抽象层剖析

在计算机世界里,硬件厂商的“百花齐放”是好事,但也带来了一个大问题:不同品牌的主板、显卡、键盘可能使用完全不同的“语言”与操作系统对话。比如,联想笔记本的电源键可能需要发送特定电信号,而戴尔的可能用另一种方式——如果操作系统要逐个适配,复杂度会爆炸!ACPI(Advanced Configuration and Power Interface)正是为解决这一问题而生的国际标准。

操作系统内核探秘的博客 418

【UEFI基础】ACPI基础

为了让OSPM能够控制计算机上的设备的资源和热插拔,ACPI提供了一种描述这些设备的信息和控制方式的结构,称为ACPI Definition Blocks,它们按照一种层级结构组织,这种组织方式成为ACPI Namespace。因为OS控制了设备和CPU的电源和性能,所以也需要通过ACPI来管理温度,ACPI中可以方便的定义温度区域,温度指示器和冷却温度区域的方法。ACPI表描述了计算机包含的设备以及它们的电源状态(D状态,D0表示正常状态,数字越大性能和耗能越小),使设备进入不同电源状态的控制方式。

技术联盟 3069

微信聊天记录数据库解密实战:从WCDB到sqlcipher4的关键步骤解析

本文详细解析了微信桌面版聊天记录数据库的解密实战过程。通过逆向分析,定位了微信从WCDB框架到sqlcipher4加密的关键步骤,并成功提取了数据库密钥。文章重点介绍了如何通过动态调试、字符串定位等方法,追踪并验证sqlcipher4的加密密钥,最终实现对加密数据库文件的解密操作,为安全研究和数据恢复提供了技术参考。

weixin_29322553的博客 1071

如何使用WinDBG跟踪调试ASL/ACPI?

在现代计算机中,硬件和固件(BIOS)都必须符合ACPI规范,以便操作系统可以控制所有模块的自动配置和电源管理。 使用WinDbg调试ACPI代码通常需要两台计算机,一台是目标机(Debuggee),另一台作为主机(Debugger)。下面就介绍一下怎么在两台机器上建立调试环境。1、配置调试Debuggee的连接方式Windbg支持COM、1394、USB2.0三种不同的连接方式,看到网上

Sean的笔记本 1万+

压电阀控制器设计-总章

本文章用于回顾记录本人制作压电阀控制器的关键技术,本人所制作压电阀控制器已经上市得到应用,特在此对一些关键技术进行回顾记录,欢迎从事压电控制及压电阀相关人员一起讨论

qq_42712859的博客 849

SAP批量数据导入实战:BDC、CATT、LSMW三大工具保姆级对比教程

本文深入对比了SAP系统中三大批量数据导入工具BDC、CATT和LSMW的核心定位、适用场景与实战操作。BDC适合复杂逻辑的编程式处理,CATT适合业务用户快速录制回放,LSMW则是数据迁移项目的结构化首选。文章提供了详细的选型决策框架、性能优化技巧及常见陷阱规避指南,帮助SAP顾问和开发者高效完成数据批量维护任务。

weixin_29213525的博客 151

BIOS知识枝桠——ACPI

ACPI在BIOS中的应用ACPI OverviewPower StateACPI Table ACPI Overview 完全解读:Advanced Configuration and Power Interface Advanced:为什么说它是advanced呢,主要是它替代了以前的APM,APM全称是 Advanced Power Management(高级电源管理),他是一种基于BIOS的系统电源管理方案,它提供CPU和外设电源管理并通过设备工作超时设定来决定何时将设备切换到低功耗模式。目前最新的

这里是为我所统率的战场 7370

别再到处找离线包了!Visual Studio 2022 企业版/社区版离线安装保姆级教程(含工作负载选择指南)

本文提供Visual Studio 2022企业版/社区版离线安装的详细教程,包括工作负载选择指南和批量安装优化策略。针对网络隔离或带宽受限环境,介绍如何制作离线安装包、选择合适的工作负载组合,并分享高级技巧如增量更新和自动化部署,帮助团队高效统一开发环境配置。

weixin_28745821的博客 732

ACPI Tables

ACPI SPEC定义了ACPI-compatible OS与BIOS之间的接口,ACPI Tables就是BIOS提供给OS的硬件配置数据,包括系统硬件的电源管理和配置管理。 BIOS在POST过程中,将RSDP存在0xE0000--0xFFFFF的内存空间中,然后Move

2万+

中国1990-2021连续30年土地利用CLCD数据分享

CLCD(China Land Cover Dataset)数据集是由武汉大学黄昕老师基于Google Earth Engine上的335,709景Landsat数据制作的中国年度土地覆盖数据集。为了提高CLCD的时空一致性,还提出了一种包含时空滤波和逻辑推理的后处理方法。该数据集最大的优势在于每年30米的土地利用分类结果,且连续覆盖了30年时间。相比其他产品如GLC_FCS30、Global30、AGLC2000_2015、FROM-GLC10、ESA10、ESRI10等,CLCD在时间分辨率上更高。

qq_48539301的博客 1万+

NVIDIA B300 vs B200:详细解析与性能对决

详细解析 NVIDIA B300 整机)的性能,并与前代的 B200 进行对比。它不仅在核心计算能力(FP8)上实现了飞跃,更重要的是通过革命性的第二代 Transformer Engine 和第五代 NVLink 技术,彻底重塑了大规模 AI 模型训练和推理的效率与规模上限。其显存容量和带宽的巨大提升也为处理超大型模型和数据提供了坚实基础。与 B200 相比,B300 是一次全面的、代际性的性能跃升,特别适合那些需要处理最前沿、最复杂 AI 和科学计算任务的用户和组织。

2401_89353317的博客 3058

我所认识的ACPI(2)

ACPI常用的寄存器,及寄存器位的含义 ACPI_ENABLE, 当向SMI_CMD写入这个值的时候,系统将触发事件进入ACPI模式 GPE0_BLK, GPE1_BLK General Purpose Event 0 and General Purpose Event 1 Block P_BLK Proce

huangkangying的专栏 7896

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2489

BIOS工程师手边事--SMM模式

一,SMM概念及特色      1,基本概念        SMM是Intel在386SL之后引入x86体系结构的一种CPU的执行模式。加上SMM,X86 CPU支持四种工作模式。分别是:实模式,保护模式,虚拟8086模式和SMM模式。SMM是一种特殊的工作模式,它不依赖于具体的操作系统,完全由固件来控制。     SMM模式只能通过系统管理中断SMI进入,并只能通过执行RSM指令退出。

zhao_longwei的专栏 1万+

Java后端新人入职第一天,环境搭建,全看这篇就行了

本文主要是记录一下一个新人java后端开发来到一个新公司,如何快速完成环境搭建,本文意旨一个小时搞定所有环境搭建,让你更快加入到新环境。包括Java、Maven、Tomcat、idea、Redis、Mysql等等,还附带对应安装资源包,我这里就以目前比较流行的版本进行详细说明。

qi_ming88的博客 9279

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

windbg调试ACPI ASL Code 实例一则

准备工作:搭建ACPI调试环境请移步至:《搭建Win7调试ACPI的环境》里面有Checked Build ACPI.sys 本文中OS为Win7 x86(镜像:en_windows_7_ultimate_x86_dvd_X15-65921.iso) kd> vertarget ;记得OS一定要和ACPI.sys匹配,否则替换ACPI后OS可能无法启动。 ;我的OS版本信息如下 Wi...

lixiangminghate的专栏 4550

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ACPI 系统表详细介绍

ASL(ACPI Source Language)编译之后得到AML(ACPI manchine Language),置于ACPI table中,ASL用来定义ACPI objects,包括ACPI control methods等,可以控制hardware,读写register等。在 ACPI 中,_STA 方法通常用于返回设备的状态信息。若发生特权级变化,需要保存用户态地 SS,ESP 到内核栈,否则不需要保存,然后再保存 eflags,cs,ip 到内核栈中,如果有错误码,还要将错误码压进栈中。

qq_43561214的博客 4322

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[转载](原创)封装——封你喉(我对GHOST的看法!希望我的劳动没白费)

站在现在看昨天首先你看到标题可能觉得这不是一篇技术性文章,你错了写这篇文章的目的是来谈到下封装工具的发展历程,相信看完后会对你有很大的启示我要让你知道,其实人人都会做恢复光盘!一口气写完的,难免有错别字/望谅解.首先,我来谈谈手动封装系统的过程及其原理!(小兵的帖子对于菜鸟们来说还不够详细)手工封装其实只要解决两个问题,其实现在的工具无非也是解决这两个问题至于工具的好处就是智能,...

weixin_43630492的博客 402

windbg 查看设备信息

1. 相关命令 !devobj 查看设备对象信息 !drvobj 查看驱动对象信息 !devstack 查看设备栈 2. 系统设备树 !devnode 0 1 kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0x865b1ee8) DevNode 0x865b1ee8 for PDO 0x865b1020 InstancePath i

王俊超 专栏 5155

hal!HaliInitPnpDriver函数分析之nt!IoCreateDriver之驱动对象=Driver=ACPI_HAL的两个设备对象怎么来的

hal!HaliInitPnpDriver函数分析之nt!IoCreateDriver之驱动对象=Driver=ACPI_HAL的两个设备对象怎么来的

linux-0.11调试教程 461

玩转操作系统之系统封装部署再探!!

1.4 综述 本章主要陈述了关于Windows操作系统的基本封装与部署的实现,微软的企业部署工具的效率和自动化程度相当高,封装和部署过程都比较简单。 但现在有一个很重要的问题,按照微软企业部署工具中Deploy.chm中的简述,企业部署工具对于源计算机和目标计算机需要有相同HAL(硬件抽象层)。 所谓HAL,是由硬件制造商提供的一种薄层软件,为操作系统高层隐藏或抽象硬件差异。通过 HAL 提供的筛...

weixin_33714884的博客 320

windows 硬件抽象层问题

转自微软如果想解决GHOST完系统后进不了系统、黑屏、重新启动等问题出现的问题,请看下面的内容。微软已经用windows2000这个具体的例子给我们说的很清楚了.具体的修改请参阅Climbing的大作:《Windows 2000XP2003操作系统所支持的计算机类型(HAL)及相关内核文件的对应关系》,相关的windowsXP/2003的电源管理修改是和这个 2000差不多的。 概要在 Windo

唯她明C 的专栏 2474

WinDbg -- Local kernel debug

WinDbg本地调试

TakakiTohno的博客 1957

ACPI Table基本知识

1包在BIOS ROM中的 ASL Code就是ACPI table,而ACPI Table又分成不同类型的Table(RSDT/FADT/DSDT...etc). 2像是我们比较常使用的DSDT Table就是放了一些event code.简单说就是当某个H/W event发生后,系统会依照 描述在这个DSDT Table中的ASL code去执行,而这些Acpi Table 包在BIOS

Helping BIOSer become Awesome! 2万+

ACPI的6种模式

ACPI 电源管理的6个状态: 参考https://blog.youkuaiyun.com/qq_21840649/article/details/54927874 https://blog.youkuaiyun.com/MM22GG/article/details/7528342 https://blog.youkuaiyun.com/pankul/article/details/19417637 S0: ...

fgupupup的博客 6306
上一篇: 索引失效的情况有哪些?索引何时会失效?(全面总结)
下一篇: 翻车了!在项目中用了Arrays.asList、ArrayList的subList,被公开批评
androidstarjack
博客等级 码龄12年 3277粉丝 697原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值