|
|
( A4 p2 \) Y- e( y& e; E: z9 l" S* m
1 q5 e4 B# c, X) F5 a最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
4 f1 p) F( r: } D/ Z( m9 ?迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了./ C" C+ M* p! ^. T
0 R5 g4 s) e* @! u& oIO 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中是
7 o3 H3 u& @, V9 {8 @ j3 WECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:( D* D) q3 u& i* i$ B! I# i
y4 K. v v* {#ifndef3 P) u( V" g8 \5 a R! n! _( |
__ECBACKAPI_H__
2 W8 Y7 |5 O* s; O#define; r( K+ c# a: i8 ?1 ^* c
__ECBACKAPI_H__( ^ W, ~/ x9 A8 E4 w1 E- w, J
( ]6 Q5 u4 O0 y6 r" E+ w' |+ }
BOOL& y6 v$ P' n" f4 W Q f8 ^. a& z$ \
Install_ECBackDrv(void);
; ] d, j2 V9 o" `) B% q3 a
. z) c: w( E8 ]2 \+ ^0 gBOOL% R+ `" v: n" U3 l( F# {4 D8 M3 y, B
Uninstall_ECBACKDrv(void);4 A- J/ Y+ c9 L$ y+ g5 I+ t. t) j
2 g Q6 E' l& s. p
void
7 B& p1 l; Y9 ~) L! F* Z4 i+ MWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
+ m/ L; @: w9 N. j/ ^% t; M+ L
5 R( t) s8 a' v4 W7 I# [, J3 O: {UCHAR" N3 N8 S' | P- h; t
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);, w5 J& h9 C$ z d
' }- I1 G1 m: T- `8 z- w
. g) S: _, `" {; y% X" R# g#endif( c/ P3 P, `- ?1 x/ y
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹* j1 w9 a6 p, S
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
* h7 {* }7 ?+ C3 P
- e; a ~7 I( g1 {6 T. `That’s all!6 I) d# Q- u# ?
9 Q( F# `8 f: Q N
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|