|
|
5 o. @( @. X% ^1 |. f; k
# U* i% f+ ]; u最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
: z7 ~- C4 z; d迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
c; D( Q& c S& B5 C
: w+ k1 x# \# SIO 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中是
, @+ a# I+ j+ ~# j1 Q$ t# PECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:$ }7 I! j8 ~- r; N; M5 U
! ~7 \: S4 U/ Q5 f' U: \, |7 v' A, U
#ifndef; s! Z3 ~: l4 e& x2 a( X
__ECBACKAPI_H__. Q# V2 E- i; e1 b; o9 W
#define
3 J: e; c1 w# x4 O__ECBACKAPI_H__
( E; Z, c+ T' y; A$ p0 y
% @+ H/ E7 D6 }6 k: [* BBOOL' c9 l4 I0 R. r0 o9 B3 O- E
Install_ECBackDrv(void);
& s4 k+ `, p! y# | 5 w1 ^: ^; ~1 W9 C
BOOL) G0 K- L6 h/ o8 N$ W9 M% `
Uninstall_ECBACKDrv(void);1 [9 R+ p% b4 v+ w+ r$ e, l
]( |1 _ w4 p, ]$ g
void
0 v5 n' s+ Z; `* t& @1 OWrite_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);3 O A& \. J: a( H- F' h4 G3 o1 U
1 @! k, s1 B3 f" f, P
UCHAR- s$ T P( U/ D- f2 e9 o
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
( G p0 J& T+ X# g. q4 @
( ~ v5 e+ h H( [; D. {. E( B) X/ D; Z9 M4 n/ t; }2 X( `
#endif
( J% S* h# p W NInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
! Q8 ^* a# D! {) dECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!( s3 ?$ \ ]( L/ J1 W. X
$ f6 n b8 u$ r' u/ y5 m
That’s all!+ @* v; m4 P+ {; n
8 s. E9 Y$ C4 H8 {
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|