|
& K/ X8 W. F3 S' N
5 V& x1 l7 u5 M* W8 |( l最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。( a. a- h! Q2 |, g& a% p+ T
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
' `( w+ }+ s5 M6 k& U7 B+ {, G: r6 A4 O3 L
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中是
+ |$ k C; a% C) o% `" mECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
2 b5 p8 f8 j" r) ]4 m- S3 e
' l3 o3 ^% y6 ?: h. S9 G- I#ifndef1 _8 h' Y$ f' U) m% w
__ECBACKAPI_H__' R5 b; V' N0 Q7 i3 c
#define6 D7 Y( n# ~8 Q
__ECBACKAPI_H__. U% B+ @6 c! `' a3 ]$ w2 ~! f
* y1 X0 X& a" e& @BOOL
! f4 Z. {4 m; p$ t# tInstall_ECBackDrv(void);" ^' g+ r l1 r2 \, p9 f/ ~( {
0 n% ~: w6 T0 y2 i) X) jBOOL; b4 i B7 I5 J: O, P1 w% n* W: v G
Uninstall_ECBACKDrv(void);
& v7 V. G+ r5 |7 i, G# K* E! C0 p
& C2 z9 G$ u/ T" ]! x9 J* bvoid
$ f6 _9 l0 }2 e% S( L1 a rWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);5 G3 W+ x% j, C
. x D5 [* V% d2 N: T. ~8 t) C
UCHAR
4 J- n z- d7 x' e( `' mRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);2 Y8 d* N4 f/ z9 C
3 \; L6 n/ p' c" |* H) S
2 P- ]6 W* U. `7 z#endif
7 ~3 R, e" C5 G, SInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹$ O8 a1 v( S5 h' J- {+ {2 D8 @
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!/ r2 z" k& d4 i0 v2 d, _
" o& w2 V2 A Z& ?' x
That’s all!. a/ `& }+ f, Q! h2 y1 b8 ^
2 l \) A g# v' B& nPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|