首页
社区
课程
招聘
[原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇
发表于: 2021-3-4 21:36 14093

[原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇

2021-3-4 21:36
14093

在上一篇<ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇>只完成了2件事:

1.Bios接收GPIO SCI事件;


2.Bios转发SCI事件到ACPI命名空间\_GPE.Method(_L56),然后打印日志。


本文将处理从硬件层移至软件层,完成下列2步:


1.Method(_L56)通知ACPI.sys;


2.驱动接收及处理ACPI Notification(MSDN将这类来自BIOS的SCI事件称为ACPI Notification)。以下是实现该目标的步骤:

设备驱动程序必然依存于某类设备(DeviceNode),这类设备或真实存在,或虚拟创建。虽然本段的标题写的是创建虚拟设备,但该虚拟设备不同于Winddk Sample中Toast创建的设备----Toast通过IoCreateDevice创建,而是由Bios在ACPI命名空间中创建的设备,希望读者加以区分。

那么这样的虚拟设备该怎么创建?ACPI Spec 5.4节有现成可用的例子!很多OEM厂商为了实现硬件增值功能就会创建这种虚拟设备,比如联想(联想打钱!)ThinkPad的"Lenovo PM Device"就属于此。我们可以借助RW utility查看它的实现:

嗯,大家可以参考ThinkPad,依葫芦画瓢可以写出这样的ASL code,编译进Bios开机过后,就能在设备管理器里找到带黄标的"Unknown Device":

查看其Hardware ID,和ASL Code中_HID对象指定的值一致:


到这一步,已经进入到读者熟悉的软件领域,但是工作量仍然不小。


首先来解决黄标问题。根据设备管理器信息可知黄标是由于Bios虚拟的设备没有安装驱动,所以这一步我们用WinDDK sample----Toast来解决黄标问题!我的测试系统是Win10,安装驱动涉及到2个不起眼的方面:


1).需要为驱动包生成.cat文件;


2).为sys/cat签名。没有这2步,驱动没法安装。

我假设读者熟悉Wdm驱动,所以直接给出能解决黄标问题的inf文件内容:

Inf文件指定要使用的.cat文件为:demo.cat,参考我的这篇博文:为sys/cat文件生成测试签名,即可生成demo.cat

参考我的这篇博文:为sys/cat文件生成测试签名,可以生成证书文件并为sys/cat签名:

命令执行后,在.cat/.sys文件的文件属性页就有"Digital Signatures"标签页:

完成以上步骤,并在OS下开启Test Mode,之后在设备管理器里对"Unknow Device" 安装驱动程序,即可解决黄标问题:

ACPI\HAN0000从Other Device类移到了System Device类,另外,设备描述名也从Unknown Device变为Inf文件中DeviceDesc节指定的字符串:


这一节要分2部分:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 15
支持
分享
最新回复 (21)
雪    币: 14530
活跃值: (17548)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2021-3-4 23:15
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
666,感谢分享!
2021-3-4 23:21
0
雪    币: 4889
活跃值: (2275)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这么底层全面的文章,少见
2021-3-5 08:45
0
雪    币: 1319
活跃值: (1960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2021-3-5 15:45
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
说到关键处 最精彩的部分一笔带过了?
register operation region?
2021-3-19 16:37
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
7
水上心 说到关键处 最精彩的部分一笔带过了? register operation region?
Register operation region指哪块?我看看能不能补上
2021-3-19 19:06
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好的,多谢,
2021-3-19 20:24
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/operation-of-an-acpi-device-function-driver
2021-3-19 20:24
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
10
水上心 https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/operation-of-an-acpi-device-function- ...
确认一下,你是想在驱动中主动调用acpi命名空间中的某个方法,对吧?
2021-3-19 20:28
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我是想知道operation region(OpRegisterRegionHandler)的用途和应用场景是啥
调用acpi中的method我这里有方法的,可以在r3任意调用acpi namespace中的任意一个method
很感谢你帮我扫盲了sci interrupt、gpe,和devienotification
2021-3-19 22:15
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
acpi.sys deviceiocontrol有好几个方法,除了evalacpimethod之外,还有OpXXXX,会在namespace node device下生成一个operationRegion,是fdo驱动提供的一块内存空间,同时还会注册一个callback,也是fdo驱动提供,在acpi node 设备调用方法时会异步调用fdo的callback 操作这块region,像是fdo在acpi node device下注册了一个小端口,所以也有异步通知的功能,不知道和acpi node device下的deviceNotification callback(RegisterForDeiveNotication向下级pdo挂的acpi 分device object结构中注册的)有啥区别,应用场景上有啥不同
2021-3-19 22:22
1
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
13
水上心 acpi.sys deviceiocontrol有好几个方法,除了evalacpimethod之外,还有OpXXXX,会在namespace node device下生成一个operationRegi ...
我靠,你研究的这么深,我看下
2021-3-20 13:09
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
14
我仔细看了一下,你说的operationregion,我们是直接在bios里做好了,所以没我没接触过。我找找显卡相关的,不知道有没有
2021-3-20 13:16
1
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
 多谢了啊,老哥,这行研究这块的真的凤毛麟角,少之又少,懂得人也很少
你这种文章完全属于精品,收藏和点赞数不相符,帮你加把油了
2021-3-20 14:08
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
16
水上心 [em_27] 多谢了啊,老哥,这行研究这块的真的凤毛麟角,少之又少,懂得人也很少 你这种文章完全属于精品,收藏和点赞数不相符,帮你加把油了
那就谢谢了
2021-3-20 16:37
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
感觉opregion是另一种异步数据交互形式,有点像r3层的内存映射,在bios和driver之间共享一段内存,大家都可以访问它,但driver不能主动去修改和写它,必须等着bios有需要的时候,利用drv注册的ophandler去修改它,好想是这个意思


兄弟有空的话,可以翻翻你那边的显卡驱动代码,是不是这么回事,如果我理解的不对,请尽管指正我
2021-3-21 10:56
1
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Opregion的handler一般是ACPI.sys 注册的,也就是由ACPI.SYS去访问。 ASL code去访问某个Opregion会触发ACPI的里面的Opregion handler.  当然driver也可以自己定义一块私有的区域,然后注册OpregionHandler去处理,但是一般没有必要,直接写ASL code访问就行了,driver里面直接call ALS code method。这样实现起来更简单,所有的同步机制交给ACPI driver去做。
2021-4-17 17:58
1
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19

好的,非常感谢指点

最后于 2021-4-23 09:11 被水上心编辑 ,原因:
2021-4-22 14:10
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
所以Driver主动调用 acpi asl code method应该怎样实现,按照ms的acpi method 调用提示,也不蓝屏也看不到执行效果
2023-8-1 15:02
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
谁有完整的demo code和示例讲解吗
2023-8-1 15:17
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
22
mb_eeoynudy 谁有完整的demo code和示例讲解吗
微软泄露的xp代码里,有电池 ec驱动,这些驱动带有你要的driver调用asl的例子
2023-9-19 00:07
0
游客
登录 | 注册 方可回帖
返回
//