|
|
% V6 }1 F' V* s' z0 j
( \0 k0 n* u9 C. a C: x6 W4 [
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。% O6 C9 P' `- R
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.. _0 c+ P% V: M! z/ b
8 ?+ d) Y; R: }) e& M2 J. b
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中是
+ ^' [6 U$ b" l6 IECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
$ w% m( k) ?! G/ c" ]7 E $ j7 k" Z0 D: i* {+ L, }0 @
#ifndef4 c r' V6 z' S+ [5 N- g" u
__ECBACKAPI_H__% R* @! ^3 ^1 l. S x; m; r+ v
#define
6 s# f! i& R4 J" L__ECBACKAPI_H__# M: X4 n! ~7 v6 q- n. N- \0 H
' D! @0 `2 l. n' |BOOL
8 M$ Z) o, o- V$ Z- O' e; ]Install_ECBackDrv(void);% A( x1 x5 }, e0 l* {
3 v8 o0 ~: s0 I2 z) S
BOOL! R! k/ d( U) N. W& M9 V6 w1 j
Uninstall_ECBACKDrv(void);, w' }% _; Y b2 Y+ `# O0 _
: j/ t8 ]4 q8 s: }void
( v) b4 ?! j" T, u9 nWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
# k, P+ T j2 l
. O$ o8 M$ @1 W: I+ R) P: O! [+ rUCHAR
5 b2 \& n; u. w: n6 uRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
8 |- Z2 t& s# a/ p% W% F$ L* g; F
0 w$ x" p5 Z8 ?9 n% t8 y* r: N" b
#endif
4 e7 c; h6 D& [/ e: YInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
$ L, Z6 H/ I" rECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
( d3 O. |' K) Q 6 k. l5 l8 W& `' o, c. H8 s
That’s all!; b4 e. D4 d2 B% r& F* E' ^
4 |7 {' _" d c: t" O. F* q3 IPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|