|
|
% }5 P4 W6 W: b5 K8 b. F; \; k
; h1 W, e0 u: R+ [6 W9 J0 Y最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。" e8 i' {2 ~0 c. C# \
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.0 M$ R4 k& } t r" [
& m: C% e! c: R* a
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中是
# H! H0 f- E( M& nECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
4 f5 X5 `- t4 k. a + O( D' W, X7 }" V' Q3 S) z
#ifndef, K4 J, ]9 H- l6 b, e
__ECBACKAPI_H__- u% L7 L$ Y& }" @+ L7 q5 R
#define
. N! R8 a7 A# X" I& N& X__ECBACKAPI_H__
3 Q/ j/ v" [& M$ f ! r$ p$ J7 J8 a) R
BOOL, q) C, h; E; q/ f% n
Install_ECBackDrv(void);
6 n2 R) @8 Y# l- M H. R. _
. g4 Q Z4 }4 \" jBOOL
& `! W( d" M3 K4 A! wUninstall_ECBACKDrv(void); A0 l9 F, A6 ~0 j3 e. E
% `2 D3 F6 C' [% e5 }9 Wvoid
) C$ g* o% \9 u4 }Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
8 J" B; T- t$ e7 P
D# Q$ U- [+ V" J$ pUCHAR* ]' Z1 H, G' H. x o/ U) z1 Q2 `
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);9 N& a# o* f% @( e# c
2 i. M2 s- ^8 T5 y; x
, d. ~- ^7 F) r1 I# M3 B; a; g
#endif
7 D9 J" B3 p5 Q7 ?9 }% q/ CInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹$ E- u) r5 o. d& e3 l
ECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!) y4 j& }+ Q7 q" @0 L* y- V
. v& t4 B; y+ d3 Q
That’s all!# |! I$ \( S, o8 T6 p0 ^0 Z* v
/ \ Q+ Q$ J) Z" } o
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|