|
|
% w, j# ?" r1 Y" G8 T* K
6 v- }9 ]( X4 t, f/ H最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。! |: C6 c! }5 e/ ~2 J5 J9 T+ M
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
! S: V- L1 h0 o$ t+ |
, R8 B: ^6 C+ n8 P4 b/ RIO 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中是
( A5 r! q; ~; z9 I9 kECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
6 p4 T6 [6 q: V3 f* ` 7 w& \6 c% z: i& |- P( v+ a
#ifndef
2 F6 v$ C! ~$ y0 Y) a6 E__ECBACKAPI_H__
2 E- `" m# x2 j#define
5 [* {2 w4 I; q1 Y) o$ H8 N__ECBACKAPI_H__0 {$ W/ T9 F+ m9 D) n
8 z+ r ^, H. S6 KBOOL
# z! G$ W) [0 @. cInstall_ECBackDrv(void);+ [7 g7 f: k8 D: z t' r" i
, {! n9 N8 o5 k; Y
BOOL
6 Q4 m' T0 ?! h2 E& b0 vUninstall_ECBACKDrv(void);. p( ~( B/ W' N
/ o! I6 ~7 n9 i
void& n) U7 ]$ g' Z) y
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
' r3 A' s& f5 D; Z8 L$ @+ D4 b ) C# I( v5 I; v+ X) \0 v- a2 M
UCHAR8 k* ~+ p+ b( ?
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);2 @! A, O6 N/ E# r( a+ K
5 ~, i% }% `) r' v" t" u
+ d' A9 _* k2 {0 O7 ^1 A8 |
#endif$ t! K, S1 X/ p: ?1 b- l
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
3 y7 f3 c- s: b% [: g0 L. j. f1 L2 OECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!' ^2 v9 h8 p) ]7 {- X3 D
. ^/ H# }4 p# w. b( s# |1 @# h( BThat’s all!6 Q, K) x. r0 I; `# S7 N
\) N6 B8 X! K' O' A) o( oPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|