|
|
4 w, w* J- V ?1 S. Y" [! D
3 R/ T! g( o* d) k! h最近工厂PE端需要一堆测试程序,这些程序主要是用于测试EC的各种功能如:测试风扇,测试电池,测试键盘等等。而且要求通吃vista,xp,winpe。我最初打算使用wmi acpi实现,可是发现wmi acpi在winpe下无法工作。
5 O5 n( M7 ~& U' e, S; e; K迫于无奈只有实现一个IO port的driver,然后AP透过EC的back door 存取EC XRAM®,只有这个方法才能通吃三个平台了.
A/ k2 m% t! {% B& f0 S" w) O4 C! l5 V: n2 K
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中是
^( r( v7 S- `% \1 J, n p3 _! [' SECBACK.sys的source code,lib是我导出的user mode api 一共包含四个函数:
% ]) |) O$ U9 r0 N9 z0 q
/ ~: t* A6 t5 A& J3 {4 T#ifndef' i( d% n; k; ~( v7 v/ I( j2 E. f z
__ECBACKAPI_H__+ J2 l* s6 ?8 C; x; c" z
#define! Q2 z+ ]! a$ ? }/ |5 x9 o
__ECBACKAPI_H__9 [3 W7 I9 V$ p. q% t$ k* A
9 v1 N# V% L8 G0 J% UBOOL% m$ p c; D6 G- y
Install_ECBackDrv(void);
% s- @8 ~4 q3 }- D/ W+ P / A- g" [( n. j/ J7 `; N
BOOL
; X4 w7 k1 f. t! O( p! CUninstall_ECBACKDrv(void);
8 V; ?( m; x; w, W 3 E# }: @$ Y$ M1 H: V+ ~. Y
void( C, v" ^7 Z; _0 y, {
Write_EC_UCHAR(IN UCHAR port_base,IN UCHAR add_H,IN UCHAR add_L,IN UCHAR data);
2 x" e* \+ Z; A+ C/ q2 H% L! M' D 9 p( Y- h2 c5 Q
UCHAR) y/ C. _( x K6 m
Read_EC_UCHAR(IN UCHAR port_base, IN UCHAR add_H,UCHAR add_L);
/ z% [& |6 q% a1 l: H; d* }; t0 ]' `, P9 Z$ a8 w) i
, u. ^) B* u4 E) ~$ h+ C
#endif
2 t# ]. X, z3 B7 @# m8 G8 RInstall_ECBackDrv通过创建service的方式加载driver,这样AP才可以和driver沟通。读写io port部分也被封装到了Write_EC_UCHAR & Read_EC_UCHAR中了,user不用再去调用DeviceIoControl再往下送IRP了。使用完之后需要调用Uninstall_ECBACKDrv,该函数会将Install_ECBackDrv创建的service移除掉。文件夹
8 S1 q- S, O: y: t: EECBDTest是我写的一个测试程式用于演示如何使用lib文件夹中导出的函数。这些部分实现了以后其他组写测试程序只需要按照sample code写法实现就好了,我就解放了J!$ `" ^5 H3 s8 {, N
4 Z7 ]2 c8 V$ h) s9 w5 T& [+ a- y
That’s all!
( t- N) z. b: ?
% H6 E2 j! J! R8 X1 ~Peter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|