|
|
8 C# r( P$ K! L& r3 y f$ b! E/ N
; Q! i/ [7 _; X+ G/ n( C3 \2 Y) S最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
4 a1 Z8 c+ v! U }9 P迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
( ?: p8 @2 t( p" C% Q
4 W- c+ {8 y4 y4 L. zIO 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中是
% m/ o4 r0 A, P% U! ^ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:" U; L) O. q' v3 a
$ \- T, ~9 L6 D; I#ifndef
3 D$ I+ J, v# v. f/ P__ECBACKAPI_H__+ ], z0 L1 `2 W0 A
#define7 t# w5 Y4 g& R# G* d: \# s
__ECBACKAPI_H__' v9 N7 C* j6 S
2 h0 R$ _ K5 a' Q# @" dBOOL) Z% c8 E' A0 I$ H. @( q
Install_ECBackDrv(void);4 z! `- m/ A' c6 X- @
& J0 ?/ K3 n: K1 i; S$ l6 t6 RBOOL
V( a2 ~/ n* |7 f2 e. dUninstall_ECBACKDrv(void);' _% g) n- r$ ]! w/ T# X7 J
0 [; _- m- E' L7 G# u2 {void
/ Q/ h' w7 ?3 j) U- \Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
: s6 t' o; a8 a4 U* ]; C9 R3 f- M , ^# s6 w% `( `) G
UCHAR7 t. ~0 M: b" Q. Z# `
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
2 u y' S" v4 w8 E- h+ B
. [/ M1 a, E' |6 _
: e4 O- e0 ?* ^& `6 H8 B& t! _#endif* V8 z( m! F2 G) T) |+ {
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹; Y' x9 v& Y) ]% I' _
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!
8 H: g5 \7 e0 g0 r$ N
8 i4 n. E, q/ aThat’s all!0 Y6 F: T3 F; V7 c6 w
1 R& g' c% M4 w8 K* [+ I0 }" A
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|