找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20261|回复: 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。
# x, b' v1 ]" X: S: O7 j: AKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq2 J- C/ Y* K) B; {4 I" a7 Z
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。1 [' O& |  `+ l& l+ \. n
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,$ S6 _0 X& J9 u: q, {
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,* @+ A! Q) W1 p  k; Z  W5 g% w
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。  E5 v+ R! }( h7 y
$ _) d' }, L4 O: i8 L/ B" H8 {
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
/ @% H6 H" V3 E( m+ ]; X    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。8 v0 M. I6 H: A. M% G% @
; q% q0 I" u# J
    请高手指点一下。  I2 G/ i! G9 U  j. H/ B

3 Z2 f3 \8 R* q4 g. k2 H  r    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
* q) f7 ~6 K# \2 f#include <string.h>
& C" O( T. r( Q' L3 ?#include <errno.h> + H4 d0 _1 a: z  D
#include <unistd.h> ( g6 z4 Z8 \# v* }4 e; E4 |1 a5 ?
#include <fcntl.h> 5 E& B% J% J, w, U5 F/ }
#include <linux/kd.h>+ K3 B1 G1 v% r" S
#include <linux/keyboard.h> 5 v9 F) x0 {" t2 H) c
#include <termios.h>% l7 E8 e. }5 s- ]6 \+ K( |
6 R# D2 K* H) N0 v

& R/ t" m+ `: Q) `9 n#define KEY_DOWN 0x100
0 V. J/ ?: Y$ K#define KEY_UP 0x000
  @. V) e0 N: K, F0 `+ W: B: }( g7 G. ^( B% Q) }) c7 P/ d
int oldmode;
* s* a1 }$ r: b' I0 n) `2 x: {7 f- P9 w9 `
struct termios new;# Z  G- s  K. N
struct termios old;
  s/ @  n% R) S7 i1 M7 u: f3 A1 n. t% p* G1 m- T/ c, H
int get_key_input(void)% f' g+ f1 U( G. c) _2 p
{& H7 ?; a3 H8 g$ i9 {. P* o
int keyboard;
6 v  \  ]8 ^1 w# ]* y2 E8 Aint keyboardcode;% s, J( f- \! K% B8 ?0 c
% {8 `: E  q) e
keyboard = init_keyboard();$ c9 M- x4 p; F* H/ f
do{
0 O4 ^. R9 @6 c! Ekeyboardcode = poll_keyboard(keyboard);
* U, }- ]. h# n+ Y) x  r. {if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
. l2 t3 x6 |7 K/ ?/ Q) ?/ okeyboardcode = keyboardcode & 0xFF;
/ \" I, l) M. A& K4 S5 v3 e//
1 v1 M' c) \) I  _( @1 F3 d}% a$ F6 n- v& Y0 U
}while( keyboard != 0x58); / T* Y4 q2 e  ~* [
exit_keyboard(keyboard);
8 P1 R2 z) _, U: S+ p3 Y4 l& Treturn 0;
( u1 I* r5 E- V2 d, u+ @  ~}& d' N+ [( ~# r8 e4 b, X
+ D0 n" _+ n2 H% z: X7 _; j
int exit_keyboard(int keyboard)
' L: V7 X3 k! P' h$ T: R$ R{6 V/ b& a1 c2 F& `* r4 x2 O# H
ioctl(keyboard, KDSKBMODE, oldmode);
8 N5 u3 K9 K4 a0 ftcsetattr( keyboard, 0, &old);, J7 ^, [% a& u2 |
close(keyboard);
; j, S. G$ p& v5 Areturn 0;' I. g' |) C" E& T4 `7 Z# K& P5 F
}
0 A6 o5 f) l& ~1 _int init_keyboard(void)
  b% d2 R4 Q, b6 b8 ~7 j{0 q- O' ]$ _& T4 j
int keyboard;3 r- L1 }) W6 ^4 C6 r7 j
) j  Z# h' W" A: s) V
keyboard = open("/dev/tty", O_RDONLY);
' z2 Y: r( e! uioctl(keyboard, KDGKBMODE, &oldmode);
/ i( ]: r7 n1 d1 |tcgetattr( keyboard, &old);
* ?6 C2 [' p  Ltcgetattr( keyboard, &new);+ v0 x. O9 e7 \) i% R7 |7 V
5 S' J. l- f, Z
new.c_lflag &= ~(ICANON | ECHO | ISIG); 7 W: X7 U/ h6 s1 S) T
new.c_iflag = 0;
  V3 Y) {3 y) o7 Gnew.c_cc[VMIN] = 0;; c$ i, D( y+ ~+ e4 Q
new.c_cc[VTIME] = 1;
8 q3 J7 j  V. F+ B4 I& O+ T- J" b  T: B0 N: z  z5 s8 D! I7 t, P1 S, |
tcsetattr(keyboard, TCSAFLUSH, &new);
# W# t" ~9 S7 x! c. Jioctl(keyboard, KDSKBMODE, K_RAW);
5 H, {$ b# H" D5 m+ \6 v) t; M) K( u, i2 L7 G3 m8 _+ \: _: R& E
return keyboard;, ~5 N6 ~+ _/ X; f9 _
7 R, ~  t9 v* J8 [3 o* M
}5 F: Y. r1 Q3 N% e" s

/ R& y- O! o7 d& n3 bint poll_keyboard(int keyboard)
/ t0 M/ J: Q9 {8 M, \{
4 I# Q% |7 ~* z! G8 Yunsigned char buf[5];
) \. J3 B* S* a" K. J0 [6 T6 n& Kint n;  V& O! R) a. N) I; z

6 a" T( t0 r: N+ |: t8 B5 Dint kc = 0;- q  o1 R. Y8 j6 f; S
int i = 0;
. @8 H% U& ~- D' }int s = 0;
- j# D+ _7 m8 A$ j4 u9 Q  `n = read(keyboard, &buf, sizeof(buf));   p, @( C, r- i7 F: v! _4 E
while( i < n){- q( D; i6 M; `- {
s = (buf & 0x80) ? 0:1;3 s. r, E) G) f& n; H  l
s = s << 8;
) ]8 w2 ]- N, U9 q  f" z: \if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){: ]& Q4 |0 b& s8 n! T; b2 p" f( ?7 }
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
& [* Q% ?; \$ R* l6 Ni += 3;
9 I* K4 ^0 a+ I8 b' ^! p}# K2 H) ?6 l1 G) a* a/ _! P
else{$ U' p7 t  k: y4 v/ ]7 A
kc = buf & 0x7F;- H, }  p' Q, Y$ B0 A
i++;- s- G& w' D1 g6 v0 y7 l( I
}. g2 e7 g" W$ i* ^* G/ ?5 W- j
}
% A; [) y& I* a) {4 N& S" Okc = s | kc;
! p' Y) B, r, t! yreturn kc;
/ ~; B" b4 i6 H3 y7 n- g' z; F}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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