|
|
3 o- N- P5 b' u+ n- u, O2 M. g5 ?9 X$ Z+ L6 K% h! }$ L: w
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
+ f# [% U! `7 z迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
; A; S& q* J6 Q/ J+ ^0 ^6 D$ p: j* F% I5 {3 [9 y5 R% O* O: |
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中是
, f- N. O% b) w2 AECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:6 U" K- ~- M: j" j) J$ Y
5 b F7 F0 v& _" O E3 }
#ifndef# h, L+ B6 U) |* F* B5 O5 g
__ECBACKAPI_H__
1 J' p, }1 q" D6 Z) `3 ?5 i5 O#define2 C' ` N" j3 _9 g4 C' z
__ECBACKAPI_H__- `0 ? `# a0 g( l
6 ]$ e. \; _, p& k Q. S. v, RBOOL
! [" R% ]# m- rInstall_ECBackDrv(void);4 x7 q$ W+ v3 H) ~ ^8 i. V
# ^* U, O4 Y$ f+ d* N3 `* F7 |+ |
BOOL. v- R/ ~0 d; a6 W
Uninstall_ECBACKDrv(void);
. |, ~& [- w6 F2 ]1 h% N ' s% s4 L, H3 G+ E5 G7 W
void
1 I+ s" h+ `9 S; m1 V* j" C" T+ B2 ~Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);* Q. f$ d) ]; M5 X% X& f
! v& X3 L1 B5 E& c4 ~: U+ d
UCHAR
0 }' x3 K( q+ K! g8 y5 Q, D: l; QRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
# S ~, |; x& n/ a' S6 d- l. b+ M8 v! y4 Q' |
: n' |4 e8 z8 w+ f! e7 C
#endif+ N0 a: w) A# A& F7 w# N
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
9 X1 y2 j( i* N, ~: `! xECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
, b1 r; {+ P6 G9 v- E+ _ ( ?/ I9 g) o: Z5 e0 C
That’s all!
7 I2 j: T6 r# w# O5 A & l3 d4 g6 N; r7 p% h0 R
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|