|
|
! M2 _" W5 L) W
' U G1 p' D7 j5 X3 m
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。$ c) t$ L8 D7 S1 K
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
K( ` i. \7 L
# E, ~$ \* T a ?# XIO 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中是
2 `( Y( P& v) |; L' n6 cECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:0 ?9 A+ B9 B4 [+ m
* l z2 j* [2 O$ b! {
#ifndef" k1 o! d+ P2 F5 V$ R5 I4 _' V
__ECBACKAPI_H__& m# U" e& \$ n$ H0 ~5 O8 n
#define
?8 }$ g* K6 E1 l3 f+ D4 E. D3 r__ECBACKAPI_H__
: y" Z) X: P# f* G/ k6 `8 h, c
7 T& Y' c# J+ g w7 l; c Y) t, TBOOL
( n% m9 j. k( m7 M( AInstall_ECBackDrv(void); ?8 |- a1 }+ L3 b" w: X% m8 k
+ i$ O7 d+ P3 J z6 P" VBOOL
. M( _0 f8 J) l& y8 | a! _Uninstall_ECBACKDrv(void);' k8 C- H2 o3 }) A
: N6 _) t* b- u8 {4 [
void1 i0 v$ M: L2 v8 |0 g4 b
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);! e. |" v: a9 o2 N: [0 I
' t; _* l$ }4 ^. W
UCHAR: q4 v1 a0 [) R6 v, w) d0 g( r
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
5 F7 _% S4 y! l7 S1 Y" B) o4 L3 `3 M3 n# E/ W# O
' {% ^6 @) X, r9 ?4 w. @#endif
3 A6 W( b3 J# O4 {" X# o! [Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
; f* }, `' c' R$ b/ U/ s! wECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!; u ?2 d: d# R* i4 \
! |8 W: t+ ]) {8 lThat’s all!* q8 r. a0 k2 e+ X; Z
8 J0 G! `+ X" N" A1 N
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|