|
|
3 ~+ t: u9 E! J: b! B4 U3 \
( G! t; ] T+ m/ b1 t J9 m( r* i最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。4 t% J$ F9 n+ U5 V; H M
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
: m- s& |& R# o. s( J+ I) N$ C3 i, ^3 d, q2 K0 K
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中是
+ k5 b/ n0 b6 m; gECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
; D6 n+ }3 _1 h I, X3 n 3 g: r' M- \ Y; C
#ifndef
! Q2 T0 Q& d3 m5 C, m3 S__ECBACKAPI_H__: d: w6 R M7 e; S/ B
#define3 E3 L0 Z8 Y' F( P! H
__ECBACKAPI_H__
+ T8 O# v' C" _0 F1 l: [: w4 W9 V 4 \1 s2 O* Z: `$ Q5 u
BOOL
$ r' t4 j# H, O3 F2 y9 A2 pInstall_ECBackDrv(void);+ g( b# b" g/ U$ y% e0 r
" k8 `9 m* G I5 mBOOL) N3 u8 T3 ], U
Uninstall_ECBACKDrv(void);
" B- E. d( P% u+ L* F. o& r- s' c6 a
- ~! A+ N9 K8 v; |4 yvoid
" _0 T) B) t$ a- H" j. bWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
5 a3 g4 U& j; I: R: i2 a G & D- e/ m2 _4 H& c
UCHAR; P5 J. t9 a" u. I, a
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);0 o) u* c. ~- t& H) C9 r
T2 j* b: M$ |* \9 L$ Y6 Y$ C, u, Z
; B( [8 F* O9 |+ |0 ?' ]; E( I
#endif2 y$ F! j/ k# T0 ]* Q/ ]- s
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
9 ]+ b; d, h. d7 mECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
, T7 z: A4 w% [* y/ q" h+ q5 Q
0 e9 C+ j' q, t* O. VThat’s all! e1 Q) d. ~4 \9 t# A; v) F2 x! `
( D, ~; J t7 B1 f& _1 V
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|