|
|
% _7 b/ V P6 }1 e
z8 E7 j3 j2 }& l x7 j6 N" o最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
' O( c' b! T7 @ n4 e% K迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.+ X5 J( Q* n6 w* Y, `+ ^
& b1 N: b; G7 W& @: v& A v
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中是
& j2 f' r: O- b8 ^1 o6 EECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
4 @, v; g% y5 w3 j9 i
4 b6 w6 h7 I/ [* ~3 R6 y#ifndef6 k" Q; d0 [" n
__ECBACKAPI_H__6 d/ m- r1 D4 Z0 x: T. f- j" R
#define( N$ S% ?) m2 D! P4 \+ y
__ECBACKAPI_H__: S( ]% J" g8 j) L/ p9 |
& r3 J S) f3 G/ i
BOOL
( W. B9 F6 W, U# w+ ^4 v& G JInstall_ECBackDrv(void);
6 J" V( ?6 y+ P3 L H: r$ Y
8 Y* K+ e% E) ?+ m& H6 SBOOL
0 x! L$ r* c1 H* w2 @- Y. h2 uUninstall_ECBACKDrv(void);' Z+ ~$ }: m/ M; r
. H- K3 r! c7 l
void9 h1 ~" |7 @, Q3 b* [
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);4 Y- E7 O% ~: R- z
( a( v: b2 ]2 E. m
UCHAR4 B' d/ d \+ I* C% _/ Z4 u6 l1 \
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
! d6 o8 A; p8 ?% Y! k+ t4 j1 @. Z5 ?, N% U2 ?/ z
6 H) j4 S2 ?/ O
#endif9 |: A- Z* z& l+ S
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
5 b, X) M2 p+ y6 QECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!9 n3 s( ]( ?1 z3 n
4 n5 N5 r$ Z* S3 v. ?
That’s all!
3 n( P. R2 X! M4 A0 l& ~4 ^$ M
h3 t0 Q# R! K6 fPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|