找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19273|回复: 9

WINDOWS OS如何获得的SCAN CODE

[复制链接]
发表于 2009-7-24 11:11:14 | 显示全部楼层 |阅读模式
如题,这个问题一直困惑着我,是INT 16从键盘BUFFER取的吗?还有,是谁通知WINDOWS,让WINDOWS去取SCAN CODE?我是菜鸟,希望各们给予解惑!
发表于 2009-7-24 11:54:29 | 显示全部楼层
Windows下是通过keyboard Driver获取键盘输入的,而不是INT16。
7 H- f% P2 G0 EKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
6 \% o/ j. T& `% e以后就会收到scancode了。
回复

使用道具 举报

 楼主| 发表于 2009-7-24 12:03:00 | 显示全部楼层

回复 2# peterhu 的帖子

谢谢Peter,那么当Connect_IRQ获取ScanCode后,它是不是把这个SCANCODE转化为一个STRUCT,然后放入键盘钩子链中呢?不知道我的理解对不对
回复

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。0 T$ ~1 E. c3 n/ v5 Z8 r
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

 楼主| 发表于 2009-7-27 12:58:06 | 显示全部楼层

回复 4# winbondowen 的帖子

THS,
& c, C# G( l0 f1 U( B, U键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
. N0 M5 n; Z$ a% u1 e另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。/ p  I! @) U! ~7 v: v

/ x. S% J: D. ~7 k# k- M    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。. G8 y+ P8 J- ]3 E
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
0 Y# _( m7 `# z8 g
6 v- n2 [! r# q* Y    请高手指点一下。
9 p1 F  W6 p0 u; n1 S% A5 S! H! s6 m  b" s* @# F
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

发表于 2009-8-20 22:24:13 | 显示全部楼层
顺便请教键盘中断程序怎么写?
回复

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> " K1 b% [6 [2 |! E% h9 |( i4 ~
#include <string.h>
; |: n* x0 f( [2 N* l#include <errno.h>
0 B- m: }5 W2 j$ q! T4 x#include <unistd.h>
9 Y& I+ n% f: g5 p2 {( z#include <fcntl.h>
) Z' V9 g2 d! Z- L. e/ C#include <linux/kd.h>
1 E8 U" d; K& {2 k8 Z#include <linux/keyboard.h>
. ]+ v$ e5 e, j! z#include <termios.h>4 M. c" @0 g- j. n

' D0 V' `# J, `, N
7 p& ~  M4 Y6 A5 _( q: @- P#define KEY_DOWN 0x100; h0 G- o1 v2 K# o. u- c6 i+ Q9 l0 O
#define KEY_UP 0x000) q# g) e8 l% `/ ?
& A8 Z5 V. a  T; t6 Y. H1 |. t
int oldmode;; x* @% \7 z3 X5 K
# m9 v$ y& n; A& t; e
struct termios new;. B* U9 j) ?0 g7 a  C5 Q
struct termios old;% o1 q  E' z* U/ S
1 w3 H. N; J2 Q+ \$ W7 x/ F  \7 z
int get_key_input(void)
* \; N0 V( K+ Q. z3 c/ v+ o{
$ R( V2 |) A1 g6 `int keyboard;
! u0 ~, J6 ]4 C  C- {) @; ?- }int keyboardcode;
8 t9 @: a9 j: b3 X5 F: `0 S4 }# m" B. j+ n+ ^
keyboard = init_keyboard();
4 s7 A% ~& A8 odo{
$ z' i; |' X5 n) p, [  C2 `5 Hkeyboardcode = poll_keyboard(keyboard);   n. `! {. y7 e- g
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
5 u8 N: k# |. X) S7 \; skeyboardcode = keyboardcode & 0xFF;
1 [& D' {+ D# q( l2 d, u6 }% h  O) i//1 V/ |  \" Q2 K6 z" a& o" f7 P
}/ [( c5 D* p( M
}while( keyboard != 0x58); 7 S" a( C# K: g: Z4 B2 ?3 B
exit_keyboard(keyboard);
6 h6 x+ ~' [8 hreturn 0;0 Z* `3 i2 I6 y! ]4 V, A
}2 ^  G3 s/ @+ L1 _( S; {/ ]
. }# C5 _5 C5 m( |' B6 Q+ p1 g+ Q6 U% C
int exit_keyboard(int keyboard)  |- Z5 p0 Q' Z- Z
{
, X& h6 b4 ?& J/ o* i" F) I$ b* i$ sioctl(keyboard, KDSKBMODE, oldmode);  ^  L2 S$ Q* g
tcsetattr( keyboard, 0, &old);$ e& C0 H" S9 U: ~  t
close(keyboard);
3 R6 b& ]! S" s1 Y" h& h$ Nreturn 0;6 t! l$ p+ v) ^9 J
}" Y. V" ?- j) a3 G* {2 ^: T/ s
int init_keyboard(void)' d3 [' d! r+ X% e+ Z8 ?  v* `7 J4 s% O
{
, _3 w9 m" _5 r* w8 [: kint keyboard;! i8 _% M# j$ B; x2 {6 @

5 |2 p0 [5 F( D8 S  [$ Gkeyboard = open("/dev/tty", O_RDONLY);
( e) b; C6 ~) t: d) \0 Oioctl(keyboard, KDGKBMODE, &oldmode);0 ^- |3 m0 M* f( n- D( M
tcgetattr( keyboard, &old);' Z( L" U; o6 C! k) t& L0 J
tcgetattr( keyboard, &new);
, m5 Y% q' c& C( M% P6 v, I/ H7 c" T& N/ v! N$ Q: B+ p* |
new.c_lflag &= ~(ICANON | ECHO | ISIG);
/ I- }7 [7 Z* _( s! G  Cnew.c_iflag = 0;
9 a& X0 D+ i( H1 A4 H5 A4 enew.c_cc[VMIN] = 0;+ W) c' @6 T4 r5 J& R6 ^7 i
new.c_cc[VTIME] = 1;6 Y( E  {$ j+ r+ ?6 S" |7 y

+ w9 I% ~: E! H  Dtcsetattr(keyboard, TCSAFLUSH, &new);+ J1 V1 m: |  p  M  `
ioctl(keyboard, KDSKBMODE, K_RAW);
, K$ V$ N8 V$ v7 ^3 h/ m2 b& E" r& l
; t8 z) I- q" }! s; T" ^1 ?5 Q4 areturn keyboard;
( K; E$ K/ i: o; p* K
/ P$ W+ k3 ]! }8 u! @* I9 u' V}
$ {. B& _* u3 D* E- ]0 U  R
7 R) y' i. W( n; W2 O; \1 V- }) Jint poll_keyboard(int keyboard)
8 H1 [9 a6 d: F' H{ : T+ d) }7 |/ Z# G9 r
unsigned char buf[5];
% r7 ~# f: ]2 h1 P$ g" qint n;
9 G" i7 @6 n  I1 V- P
7 c* C" l' `6 d" Z! ]9 ^. Rint kc = 0;/ a6 V9 m6 }' g* T( Z
int i = 0;
; [' m! v/ v4 Mint s = 0;! A) t( w, Q' S
n = read(keyboard, &buf, sizeof(buf));
" q+ z  O( I" V9 Awhile( i < n){
, n6 s, R; a* p+ ]1 ~  y4 vs = (buf & 0x80) ? 0:1;
1 F3 l2 _  {1 M- Ys = s << 8;, \& v, s' ~: u( M
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
; p+ r1 h' N0 ckc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);; @$ [2 `, E* p5 V
i += 3;
8 B1 s2 w# A& }, D( M5 Z}; s  c7 p+ `: R- l
else{, Q1 z' Y1 `# g* F8 V6 k
kc = buf & 0x7F;8 O4 W* ~9 I1 Z. H' j
i++;: M( ^$ K9 h; U7 W
}
  n5 v9 g8 f0 D; m, t8 r. U2 k/ S}7 j9 V' w2 [# m8 J# B7 ~: L4 a9 |
kc = s | kc;, ?3 x! v: K/ v
return kc;
" O6 p, V; s. w5 V. v& v}
回复

使用道具 举报

发表于 2009-9-2 23:51:33 | 显示全部楼层

好长的code啊

好长的code啊,能否概括一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-6-16 19:13 , Processed in 0.035124 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表