|
|
! i. Y. D8 ?' G" P
% l/ k v% f* o7 J4 n! H4 R最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。. s2 V( ~$ V/ d* f" g* n
迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.! [; G4 }- {- q, b3 Q
, X7 _' h9 R7 }# j# d: _5 gIO 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中是
( n4 k6 s, o3 W8 x6 `9 rECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
7 W5 k1 R% M1 P3 v 1 p% F/ i. O7 X' G1 U. @) Z
#ifndef) K0 U6 {) h/ z
__ECBACKAPI_H__+ u. H& K1 @; y, |2 l: q1 d, @
#define8 v C- y: J% O8 b, d
__ECBACKAPI_H__
9 ^4 v, j; t, n) U
$ i6 u. n" n( TBOOL3 g& v$ Y: N1 B* H, `# @) V
Install_ECBackDrv(void);
0 |5 K$ y" P5 U1 b x# P4 y 9 n* C1 V$ r; _7 h+ E6 f# v3 I
BOOL: X! R5 K8 C. X: p! o2 z
Uninstall_ECBACKDrv(void);
1 f8 D1 U6 E! o/ E 6 M* Q5 D2 ]+ p T( N3 f8 Y: a2 K
void
; K1 ?5 N% ]9 i1 Y, @Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
7 K3 G+ r! T0 [! l& ~ ^5 N- Y) [' ?/ @+ |7 W( l0 {
UCHAR
' l. I# ?% p! ]Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
( y' l+ M, u4 W3 J$ Z, `5 K+ z" t: ^6 [
& R0 z8 @8 x+ R, D3 {- c- ]: l0 \
#endif9 x# [% n0 z9 n( ?
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
: c0 [& G9 v! N6 `2 PECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!4 F+ _% W- P" X
! q1 H" o# }4 f- x# {That’s all!" M! l+ ~$ ~* @7 F4 H) s
6 k: h% g0 ^; O+ g" ? v1 _
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|