|
|
8 k1 c+ d/ X5 g b2 y y
5 S0 D( T. T! e) F/ \" b
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。) s* \: h7 ^$ y( S% I
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.$ G* l% g& F$ ~5 q: }8 a
, h, l: o6 |- d; r {: f
IO port driver是非常简单的driver了,winio就是一只这种类型的driver。winio是通过修改IOPM开启应用程序IO RW权限的,我写的这个ECBACK.sys则是使用DDK的API读写IO实现的。当然我也参考了winio加载 driver 的代码,所以我将ECBACK.sys kernel mode & user mode source code贴于附件中供下载。解压后会三个文件夹其中sys中是+ `; [. l3 y7 `: c" a6 E, b( }5 o
ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
* i# i9 Z' L+ e( S8 G. A
: S0 X4 d7 x. j S: `/ a#ifndef
4 w- i+ ?" W/ Y+ k9 A, q# }__ECBACKAPI_H__7 C5 {5 ]: y- S( g; D
#define
! \7 ?& @3 i7 s5 K__ECBACKAPI_H__9 y6 |6 ~# h3 [4 ?2 @) L
6 V: g" V7 ~' c4 `) F+ ^* B; s
BOOL+ |, r! l9 T& e# O( {
Install_ECBackDrv(void);' i+ `; _8 Y6 ?; H5 [: H& a, h
4 ~9 Y' j e( I8 K
BOOL, x' Q" X! n1 k9 _5 e6 r
Uninstall_ECBACKDrv(void);
& B6 B6 y& }# [
& D7 t! S5 z" j+ L; f' c) f: ~void; s7 n+ I# s; S5 Q+ p) U9 s9 m! N
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);0 A' }8 r+ v" ^6 z
0 s* C. K$ Q- e, v
UCHAR
5 u# b$ z( D0 p) i9 A+ Z! Q$ ZRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
+ z, t3 ?5 Z* w( r
$ _6 g) f o4 Z2 ~6 |2 [% P5 K! m) S r
2 H/ e4 n4 [0 q+ ]#endif/ [$ e2 j! i9 Y1 Q7 x: j0 @9 o! |6 ?
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹2 ?0 N5 ?" p' z9 J C, Y; i
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
- w; C" l4 u) {& M4 u' L. w' M$ R
& H3 F4 `- r6 r" y5 ~! bThat’s all!9 W4 v! |( H6 P3 z9 z% _# z
' E" j8 e5 g2 ~0 @Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|