|
|
$ [1 D* B' `% l5 N4 z; V! j/ e2 e' ~2 h5 ^
最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。% A' `; \0 J/ n9 E- D# U
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
2 z, ?4 s# U3 s! L& q3 g
8 G7 w; \. j2 \% W _, H3 B* KIO 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: E8 t: v5 Y- A) H' Z5 {4 P
ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:; ?, q6 ]0 V( S
5 p, {# T# k% _3 [+ I* `
#ifndef1 K. M2 t [$ ]- @. V" m
__ECBACKAPI_H__
5 }, z: w* I# V# ]/ R#define
9 n- R& o/ b3 H$ \- h6 C1 \ D__ECBACKAPI_H__
" ~! Y+ b; } B: V2 v & x1 a. y( f( Q0 `, T
BOOL
* a, A* f3 }3 ^/ a: B/ R" VInstall_ECBackDrv(void);" S' }. E' q/ C9 }1 ~
. q, E8 ]# F- p
BOOL( x6 z0 m4 D7 ]4 u% N
Uninstall_ECBACKDrv(void);
( N3 [5 m& l& J& M! Z, D) |4 E# R
% k! g# c# y* F) ]2 s. e3 R( Dvoid4 n0 C/ E9 F1 q; H
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);7 m; v0 I" h5 Q& z2 [
; S; E7 x# n; y. Y& Z
UCHAR
7 l+ h+ O# j) d' u ?3 \+ r$ YRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);( ~- F% c0 {& `5 c- M
/ c$ U# V7 G, \
& N3 R# }* O6 @+ n* O/ Z
#endif
4 ~8 s# ?/ y# t9 l4 ~ JInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
+ F7 ^) c. f) ?& dECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!- ~8 e+ v3 ]. X) W" A3 b+ [% t- N
$ x, u, G! j1 W: ?
That’s all!
, g* ^ N6 G6 A, ~0 ^1 p- [2 k' A
7 ]0 |) K$ D) W# NPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|