|
& U5 |5 D6 a& m3 R4 v3 T- e
: N! x0 u5 r5 k8 o
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
1 Y {8 k/ P& T3 L* E0 x; Z r迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了." Y7 h+ \. o2 m0 f4 ] y
( Y6 H1 S {5 k5 x3 H1 _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中是
) P" Y; v2 q6 @ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:7 _" E) N$ p! Z! Q) f
$ M/ c" p$ w3 R8 C p#ifndef
; t1 K" d3 B5 j5 `__ECBACKAPI_H__
: u" s. n( m' G$ c5 M" W/ D#define& x& z5 A& v/ M0 W; K4 O/ A* d
__ECBACKAPI_H__
% \2 Q, ~' G& ~" o r2 n" U
" {0 _! d: ]. x8 I/ @ N. k5 Y) W+ dBOOL
5 Q) ], x; s/ G8 J# M9 m3 vInstall_ECBackDrv(void);
% o) W, [9 @" d, W$ a) o. T+ m) {" s 6 ?& F% F, ]$ R% x7 k
BOOL* ?9 Z6 Y! G2 ]7 k
Uninstall_ECBACKDrv(void);
0 W7 w; a/ e+ o& Z# o l" ~. E, W0 s0 x5 ^1 i' I5 E
void
" f# L% u# |4 m7 T* {* e/ B$ zWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
! O9 X+ R# `- V5 f( s# r2 f ; S( W8 A/ B8 @, M7 q, d% ]
UCHAR
, ?& S7 |- e! {& ]% ?Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
# _1 F; Q) I# I. f7 v' s* v; o8 K0 ]1 A- q& @2 M8 `) M
6 r e6 L4 C) t6 d% T#endif
2 S% c- a- ~' G- iInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
4 r" O5 ]% ?9 m' i$ YECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!0 B) K8 Q+ s O# k" j, u
* ~1 W7 }$ T5 k' G
That’s all!4 e3 g D# n$ S3 ~, D
; B: Z! c/ Q% ^+ y s2 h/ }
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|