找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20260|回复: 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。
; i7 c7 D: ~* ]  n4 UKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
* A5 F$ R: P, n, i* j( s, x/ e以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
' Q7 a3 ?, A6 h9 y  n0 T$ A也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
0 S4 ?& r+ i# q4 w* a6 X  A键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,) i' h7 d2 i- ~# \) v' p# L6 \
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。0 X, i4 P8 F0 C: T( A; V) V

6 B  g" f" O, N' c' ^    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。6 M* l- E0 n0 X$ `% _* C
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
  Y( w$ ]  x; Z" \$ y$ W0 _" f6 W0 f$ ^3 n
    请高手指点一下。
3 ?1 I3 d/ Q4 T, C* p( n, O, o) x: Z
( Q! ~9 l) y# n# R    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
' Z9 V& [+ P+ T( x#include <string.h>
4 ^3 ~2 x* U2 }4 f9 |9 }; l#include <errno.h> " c3 W% e# x# G
#include <unistd.h> & [: R& n& c' @% f  T1 |! v# T. a
#include <fcntl.h> 1 ^2 J* N) T% b7 o/ G7 c, y- f
#include <linux/kd.h>
9 A( m0 t# u0 D5 ]* t#include <linux/keyboard.h> ! G3 p* m1 g. i' \# _5 @
#include <termios.h>
$ G( L6 e/ [5 ?) D, c2 J2 q  h; G8 j4 X7 V
9 v, w+ V1 b0 Z$ i! S, R0 a
#define KEY_DOWN 0x100
8 T( W( b9 R4 n. }" r#define KEY_UP 0x0003 Y' p; I( j: @4 I

' f; D# `  t3 N  `int oldmode;! U4 P4 d4 B& P: Z
8 O5 B" B- ~# `% \0 ]
struct termios new;
( n) n4 W' A% R" r) y) Dstruct termios old;
! E- m! y9 T+ q
$ [3 ~- w1 z) q9 gint get_key_input(void)
/ h( M* \8 ^  S8 {0 B% x{) a( F4 Y) `# W
int keyboard;. r  L8 ]/ a6 t, |/ Z" m
int keyboardcode;' O: r* ]8 C) O6 i5 A3 [: N

, V+ [4 U0 b  Vkeyboard = init_keyboard();. b  a; T& _; d: n* u' @( J/ m
do{( G2 l! U, ]$ @; V$ ]
keyboardcode = poll_keyboard(keyboard);
# I) }9 M4 Z" x+ U% l1 x# Sif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
$ B( i; G: H, Pkeyboardcode = keyboardcode & 0xFF;
8 ?8 q2 w: ~1 X: ?//
+ h' ^$ K% T) Z& M! s}* D' }' l: b" h8 o, h6 P- B
}while( keyboard != 0x58); , c% d) X" v" q8 c
exit_keyboard(keyboard);
7 c* ~# K# y2 A* U3 yreturn 0;
. h1 Q$ S8 f' k) }}! d" ^" m2 a% N
" u  }! @: ]5 S
int exit_keyboard(int keyboard)( c" z# A8 I; G& Z6 U- M5 g
{7 F- _4 W% i( S. A. |
ioctl(keyboard, KDSKBMODE, oldmode);
8 N* w$ C9 u2 c: x  Mtcsetattr( keyboard, 0, &old);
+ X3 j" n. G3 q( \# l4 Bclose(keyboard);
1 M8 D5 [, @1 ]( v& lreturn 0;/ q. }/ y$ S1 G5 z1 A! E
}- C0 b2 }% d: R, E' {/ x$ w- ^
int init_keyboard(void)$ e7 m# w1 E: j6 ]
{6 y0 D. Q4 J8 K+ H
int keyboard;
* t* V6 E9 P  i. Z6 T$ [4 k
3 v' {& @& m4 Ikeyboard = open("/dev/tty", O_RDONLY);
0 I8 Z! n; r7 b8 w0 eioctl(keyboard, KDGKBMODE, &oldmode);
2 W/ g0 y& R7 w" R( M& Ytcgetattr( keyboard, &old);, S/ w7 M  H8 d; Q1 @2 Q
tcgetattr( keyboard, &new);
" B0 ]1 ~9 o+ L9 [2 z8 i
. U: ?. x2 L7 V; R8 ]6 \0 Dnew.c_lflag &= ~(ICANON | ECHO | ISIG);   x5 a2 i# G  e. b2 x" V) d
new.c_iflag = 0;' ?- ?( [% W4 _0 u
new.c_cc[VMIN] = 0;( G/ c8 n9 v. t  _# P4 H5 q8 O
new.c_cc[VTIME] = 1;) y9 R+ g. M, F5 ]" t

/ L+ E! X# O8 u% P# m+ n' R# |3 Ktcsetattr(keyboard, TCSAFLUSH, &new);, }$ m* q- ]# V
ioctl(keyboard, KDSKBMODE, K_RAW);
, a% m  j2 S: p5 R
0 `9 z* s( `" Y; B' \return keyboard;8 g" V3 j0 _/ y7 J: }
& E+ H9 p8 n4 Z& f
}9 P; K  Z$ H5 }2 n

1 b& y  _7 W2 ^int poll_keyboard(int keyboard) . K2 p0 ?$ R8 Q( ^& Q
{
5 ~; d# m7 ]$ W' @unsigned char buf[5];$ i" R2 W: c( a4 w; W2 f
int n;$ k6 H4 k& {! q0 e( i/ }) e3 K8 j
& e7 p. J* D# w3 I) a9 K
int kc = 0;
: T- R- e5 v8 \. y4 [8 L0 A8 yint i = 0;4 J+ x0 k7 [* a. N0 q6 Z/ ^+ r# V: X, w9 L
int s = 0;
; Q& `* G# Q" f* o4 dn = read(keyboard, &buf, sizeof(buf));
7 p: E& K$ L) m5 `7 K) |while( i < n){; v: {# |' k) d( ~% m! x
s = (buf & 0x80) ? 0:1;
/ R2 h  u3 c. ?4 h5 xs = s << 8;
" C. ]% [" ?5 O5 {2 G* {if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){. p9 d  s. Z; v
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);! u' G, n/ I* @/ ^: o7 [. i& B
i += 3;4 h1 m! `6 O- `* H9 s1 |5 Z( E
}
' X4 f' r0 ~$ j" Zelse{
; O; S' J, w- s' K: Hkc = buf & 0x7F;
9 l. A  W3 C8 v3 _! ri++;" j# M; _; \0 V9 Z( e' L9 }( I) e4 k: m7 c
}
. {, g  ~5 g5 d  J}
" ?; f& h/ v! s" s: ]7 |kc = s | kc;
! j* y! ]0 N8 l/ I$ o' \$ a; creturn kc; 1 V2 @+ S' ]9 x( X. P  D  ^8 l
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:24 , Processed in 0.086773 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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