|
|
3 m( y" q! Y0 c0 Y/ J8 T
+ w& W: j2 Z$ O1 A8 F' e# B最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
) O. h( U$ B9 s( m0 h迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
# l- ~* u0 L; x: _7 f: G k
7 }3 a1 |: a x1 x4 k( n) pIO 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中是. |( ]( C( K8 x/ y- L2 W
ECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
) K# W/ q3 Q! i k1 {) ~
$ y* y+ H% n4 J! y; e, w! N4 d#ifndef
; c/ Y f0 V3 F. |; M* [9 c__ECBACKAPI_H__
0 f7 G# [2 w* o) D% w1 S4 y#define$ z( \8 f" c1 B( A
__ECBACKAPI_H__. u# Z* o$ d8 y* j
$ v, s* c+ A: s7 n5 w; i: R
BOOL6 M1 R* m! Q% `. @: [: a) A5 j
Install_ECBackDrv(void);* x( f) [' H& |% r
/ F3 X, q- }* j) hBOOL+ w/ V9 ^# a7 G5 x; t: {4 q" Y
Uninstall_ECBACKDrv(void);
) v F" I: z9 X" A" x 8 e. M) ?( l U
void* F1 t- ]: {0 M0 M! K
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);( ~& Y8 ^6 M% q+ e- I' H" l6 R
% ]0 S$ K' _6 U1 _9 x" tUCHAR
5 _7 h( [0 w: C$ mRead_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);3 k& P! H t& s6 Y$ i. s+ \
$ M D4 e A* {" E
/ z/ v/ `! u! n5 O- F r8 u6 r! ?#endif* ]- _! p3 K+ g* b% ]
Install_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
- b9 u) _+ D9 n o( JECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!6 J8 F$ c$ ]' {1 L7 y: Z
/ @6 \, L* E! s Y/ OThat’s all!2 i4 f* ~$ ^! f6 Y$ p7 @1 n
! `) W, e- O! n* K9 }1 O9 ^+ ^: O
Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|