|
|
: P; U0 i5 @" Y) B' ^% e
7 M9 p2 K p/ o最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。; b7 l; y, ?* f) D7 t# `5 A
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了. G( g1 D+ H3 {, E- N; C h) Z
; w) ]! U; B/ T1 P* _+ }4 R# j/ tIO 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 I( D) h7 o) o1 i4 A, c( v
ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:9 J, i) o" J+ I5 k( m( X i2 q
- {3 R/ A3 e, ^2 l; Z8 O) i
#ifndef1 Q" M2 [ z4 i$ @2 i7 K2 j- E
__ECBACKAPI_H__
/ \% O+ L* _: A! _" j7 F#define0 g0 f1 `2 X+ U7 T6 L
__ECBACKAPI_H__
, ~5 r4 P5 c, [, z
4 J. d) _1 l- O, _/ vBOOL
) o! ~ ~9 p* X7 W3 XInstall_ECBackDrv(void);
1 ?7 d/ y" k! A9 D: l% q' \
2 _6 F2 X. ~% m/ H4 ^/ DBOOL
. }) r) M8 u, [' x! t; u. AUninstall_ECBACKDrv(void);
( O* }5 q& \ M# w) p; |) Y + a8 i1 g/ }1 w0 q- A% d
void
5 u; j& b7 S6 tWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
5 Q! i# {# h9 e1 h, V
1 }9 i1 o) h8 w. @/ i y6 dUCHAR
; a ~9 _5 r! f' i1 VRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);6 K# z Y9 D0 t
; n( \) x6 U7 v/ q# U2 G
; o: J% |% }% N' v( W' v# H1 z* G#endif7 S5 D0 G" {1 E- Q7 z% I/ [2 `
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹; o: Q% o9 G1 K8 e& O
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!9 M: F) e! H. ^8 a: T! c2 |% y; O% z
) _$ z8 X: q6 p) P# hThat’s all!. Z6 v7 i8 }# {! @, U- O
- w3 o# f" p0 J( l8 i+ hPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|