找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20190|回复: 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。
- H' A/ s% ?( v8 i+ }/ }Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
$ I1 r" Q: Y6 R, ~以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
. ^6 V' y+ W+ B9 p0 u也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,  z: k/ O/ Q! H/ e4 Y; k- m
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
# K3 D5 m" F3 ~: |另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
: W" u) T3 m# m/ t: }; V; u) D5 _& E% A. t
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
& n3 t% S' X! J% ~0 c5 z    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。2 ^0 C6 s3 Y  j2 }

! U6 I. ?: ^5 a) Y5 g    请高手指点一下。
3 w. Q# a1 L" x. w; {. [  I9 d+ Y, I; \( e8 q7 |
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 0 r  W+ L7 Z) |' i
#include <string.h> , l- x& X5 H6 d; {4 J) {( k5 a
#include <errno.h> ' X5 b. M; C6 v4 G* ~7 Z
#include <unistd.h>
4 x4 ?0 m' K( G, C! l4 |#include <fcntl.h>
, ?) \) V6 q1 w1 E2 B- E$ A6 t3 y#include <linux/kd.h>/ h1 D& w/ r  S) S9 I9 `
#include <linux/keyboard.h> 2 {- [8 ~' ^% W. R+ ~7 @
#include <termios.h>
* t: ^" t) `/ P
( S8 A+ a% I' A% @6 C, P% U, I6 L( X7 Q7 n3 A
#define KEY_DOWN 0x100
. J- Q4 I3 v9 C/ Y8 A& `#define KEY_UP 0x000
2 f) U$ Y( U& y' F8 C" z2 Z6 j1 [; q% z% n% a6 S# R8 `
int oldmode;
7 J) C, i7 F5 w* T
" w9 T8 Q# ~$ v/ g' V- Bstruct termios new;
0 k. s  e# S. z. r% b% w$ h) Dstruct termios old;
; N& T( f# k" {( }6 Y7 J+ o$ W6 f4 p" V: q0 G/ J
int get_key_input(void)+ M$ l! z  |# L& O1 O! ]% N3 k# g
{5 ~8 j9 S5 q! @6 ]3 P" Z0 a; T
int keyboard;
/ t1 d, ^, n: \( T" n+ G. n1 D6 ^int keyboardcode;
; ^5 |4 d% W& m6 |$ {/ F% W1 V( Z; ^- Z8 Y
keyboard = init_keyboard();7 t1 i2 J9 S' N6 T
do{
  {, a) q1 J+ R' |3 [keyboardcode = poll_keyboard(keyboard);
8 X! G/ I5 c+ j9 ^3 g0 l8 I$ m  `" Bif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ - [( k2 H/ }* V
keyboardcode = keyboardcode & 0xFF;
; V/ k( Q3 h& s9 l8 [% ?- D9 U//
* ^! D9 S: `. M( O}
- t: Z4 [: B0 X; H/ M3 b% o# v: U" }}while( keyboard != 0x58); ) B# _" S  \, E& Z; q
exit_keyboard(keyboard);9 B* j& J9 j6 E
return 0;
' n. L. p1 q: y. D, y; S- C& Z}
$ t! {# \) D+ P. i/ a+ x
# j+ x5 b6 J7 ]) M+ W9 |/ P7 Iint exit_keyboard(int keyboard)& Y4 n" Q# O2 \( m. ^0 \9 P
{* v- N: X* f! _4 M& [8 M- G
ioctl(keyboard, KDSKBMODE, oldmode);3 J/ Y/ g% I& h1 E! [  I9 `
tcsetattr( keyboard, 0, &old);5 |9 y- B" g8 c. h& P4 y
close(keyboard);
- m$ N& ?: d/ n8 o0 V. n& mreturn 0;
8 p  n, T: K# J/ j( Q, N}
- Z7 N- @6 Z4 O6 [# B2 g+ r* Tint init_keyboard(void)
. {: \/ g* F( G. }; G{
3 r2 W: N# C, d! P* b4 z  Tint keyboard;1 V/ N) L2 T6 I) S" O

4 ?0 A' ^; x5 f; ?' f. }4 F1 ykeyboard = open("/dev/tty", O_RDONLY);
( O3 ~: P. U2 [. M# |ioctl(keyboard, KDGKBMODE, &oldmode);
8 B. c& q. b8 a9 e! Ltcgetattr( keyboard, &old);
9 a, P( L( a7 t: b/ I. Ptcgetattr( keyboard, &new);
' C; _+ ^/ ~; q" B0 _
$ q1 {$ O) m: Nnew.c_lflag &= ~(ICANON | ECHO | ISIG); ) K9 J: B! T2 |2 n+ c
new.c_iflag = 0;
9 Z/ y& g9 C  K5 S. `: cnew.c_cc[VMIN] = 0;0 v/ @0 a" t. u! D  y8 V+ \! `
new.c_cc[VTIME] = 1;2 L* G/ K8 ?6 l) l- E

! f- j! f( K4 u! ytcsetattr(keyboard, TCSAFLUSH, &new);
0 }- e# B4 p4 c( D# y' }  Vioctl(keyboard, KDSKBMODE, K_RAW);, S- e+ g0 X* E% s  [! c0 f+ u; v" \

& ]" D! ?( a$ v# o5 d) }. dreturn keyboard;" H  M7 \7 I2 d9 _4 J( Y0 F) c" j

6 Q! O& _; w" B9 V. V. s7 |8 G- y# f3 }}% z" G5 k4 I) G7 G' V( k8 b

% i6 h. [% n6 s; V* c9 T7 Mint poll_keyboard(int keyboard) - W- d* a+ z; {( J, O( k  b
{ 3 q4 u3 T' F* Y) m
unsigned char buf[5];
% [* x, t* N' \6 mint n;. y8 W9 y9 Y- c/ v% Z
. \0 G7 C  n3 C7 M* T/ V
int kc = 0;
5 P5 B! Y# Z2 eint i = 0;- t3 [- L5 w* E# m3 u
int s = 0;
& L2 V; t/ B4 ~2 y+ un = read(keyboard, &buf, sizeof(buf)); 5 a' G4 l7 {: C8 t5 F; \
while( i < n){9 {! m! x2 i0 r  O
s = (buf & 0x80) ? 0:1;  k# T3 K2 k  e6 X+ o; ?% [8 k4 a4 V
s = s << 8;
7 }' x1 j6 ?) M! I! c& mif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){6 {+ u# L+ Y; a/ o" F8 @4 Q/ r
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);9 G$ n, \/ K( f
i += 3;
) J0 H2 a6 I) p3 |; g: {}( Z' z  V) z1 `) G2 |
else{/ K- Y" y3 e+ U- q2 z3 ^
kc = buf & 0x7F;2 j  k. ^' [+ k: _0 W) T! w
i++;
2 v( M+ U0 n0 p, c}
1 Q' s2 h! k0 p4 P  O3 X% U}6 @) `; E% k8 ~: P6 C4 P
kc = s | kc;
; C( ?% K+ a& Z* g% Preturn kc; ' W7 G4 B$ w' {# Y5 a, _
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 07:35 , Processed in 0.039595 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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