找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19793|回复: 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。0 o$ t: ?! l  V5 l
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
8 {! D9 u5 C! ]6 E$ P: d+ c以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。1 \0 ~; K- ?: Y- Z: j2 W
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
5 {- d6 _$ n$ Q# T键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,- p' ~. ]9 z% L0 Q) \& O; d* h$ ^! s
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。0 v8 g0 T& i6 e* g' L! n
8 [! `5 v7 p0 I3 ?5 B  C9 H5 r, q
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。" Z% p" e# f+ ?1 L9 H& n3 W+ g
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。6 E3 U/ M+ G3 ^- Y5 L

! v; t/ c- g0 I( @( t2 k    请高手指点一下。
5 s% B+ e0 @, [! t- m9 _  ^: _& {" P( N/ V: ^; ^; j
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
" `' m. J5 _9 I% p% a3 q#include <string.h>
2 k2 g  W' g0 o$ R' Q, B#include <errno.h>
( T8 M0 g+ l/ ^, n% w" K; C; g#include <unistd.h>
6 A) O# C+ {1 B5 v( t#include <fcntl.h> " r" l5 y. C0 k2 r0 f
#include <linux/kd.h>
; I  T( R! m1 {3 v3 U# L" e#include <linux/keyboard.h> ; {1 I. \5 S" m
#include <termios.h>& x8 T2 N1 [: r9 m( I
2 a+ o. H: J; p7 s. ?" @
) B6 n& s+ T6 n9 [; |) ?) l
#define KEY_DOWN 0x100
5 F, I; B4 G" v#define KEY_UP 0x000
6 t  ?2 N9 q& ~: Y+ }
* U. Y9 N8 m3 {! J% c4 yint oldmode;
0 P- F. a) F3 @7 {8 f8 e4 {1 O& [2 c9 C$ J& ]/ c6 A
struct termios new;
/ x" W, [& \% I; S! K" n& V& c& `& Gstruct termios old;7 g2 R4 B7 `9 W$ B) M
. x% ]7 i1 Q; |9 Z; ]* B/ e0 P, P* a
int get_key_input(void); \2 m6 o3 K' I1 q
{3 D% B& R  L3 U4 c$ f
int keyboard;6 z& V/ W  E8 Y6 {& }- X
int keyboardcode;1 d0 Z7 Y/ O( N1 p$ d
) n9 |" p- ~6 b1 g
keyboard = init_keyboard();( O/ R* i) `# |% {' @9 R
do{
0 H: s' H9 A2 T/ bkeyboardcode = poll_keyboard(keyboard);
; c* q" y8 o% f8 q: m$ xif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ ; O/ C( x% I; @& {5 j( u8 I7 U
keyboardcode = keyboardcode & 0xFF;
% Q8 e4 @$ C$ k4 _! O//
% f2 f8 x( ]' s}
9 j. N0 w& b6 J& M! P3 ~}while( keyboard != 0x58); % x" ?5 A/ s# V' |; Y/ R* ^& T
exit_keyboard(keyboard);- c5 T1 t, h  E0 P
return 0;+ c0 O$ V3 @" o
}
& h! X3 l$ H7 y% `9 s: q0 b- r9 _1 j4 e" @; ?- I
int exit_keyboard(int keyboard)8 Q0 X- M- n0 J3 k
{
) B6 C+ z4 V8 n9 @( q; Cioctl(keyboard, KDSKBMODE, oldmode);2 Y2 B2 H$ a8 X( g
tcsetattr( keyboard, 0, &old);! I0 {, N+ {/ H) o3 t8 I% U
close(keyboard);
" ~* t* m. S) |( @' d$ o5 \return 0;
3 |  r! i! n) e) }, v7 [% b}
+ U2 }2 c) m, v; ]; Q5 Yint init_keyboard(void)
6 d" i* N1 j" a{" \; M- u6 V3 _3 g6 p: T( L
int keyboard;( s5 ~/ h# T/ W# H3 J! w  ]: P

4 b+ y& N, G3 P8 b3 Pkeyboard = open("/dev/tty", O_RDONLY);( o! n0 g) w- T& s6 O$ I0 P/ c
ioctl(keyboard, KDGKBMODE, &oldmode);$ J$ p6 }' g3 a8 i
tcgetattr( keyboard, &old);
& d7 r+ v% `* R$ W7 }1 Ttcgetattr( keyboard, &new);
2 s2 h: @9 `, ]5 E7 \9 F; w6 a/ ^7 t! o3 Q. ]0 E& \
new.c_lflag &= ~(ICANON | ECHO | ISIG); # Q; F3 b8 x/ A6 t
new.c_iflag = 0;5 ^5 X" S% f+ z, T
new.c_cc[VMIN] = 0;
2 m6 S6 E. W1 S: gnew.c_cc[VTIME] = 1;: F( S/ w6 z! W( {

( S- X0 P# [' N5 j) I+ N7 otcsetattr(keyboard, TCSAFLUSH, &new);) o* b' ^( V! S  _2 D. ~
ioctl(keyboard, KDSKBMODE, K_RAW);
( E" W; c+ `4 h" ^
2 F) M1 P! D$ B1 Z: ereturn keyboard;
# u* D4 p* \  I0 [" r2 Y0 \  t/ D6 P( F' Y) s
}
$ e& K6 v' l/ T. U' `1 m8 |& k, y/ v) Y1 e4 M
int poll_keyboard(int keyboard)
( [0 s( j; [/ x% [$ @{ $ q# j8 y  k  ]& S: r3 A
unsigned char buf[5];  D( U* D( f. q8 {6 ^% v
int n;
% W2 @5 s, n3 M8 c  E
0 e: p) q+ x0 M! l, Iint kc = 0;
9 ]; C/ x9 q) J: D! V* wint i = 0;5 n8 ~8 j( y$ F! K
int s = 0;% g% E6 y* G! r# H& |2 |
n = read(keyboard, &buf, sizeof(buf));
! P9 k& v( w  Z5 z! {% Uwhile( i < n){
( [$ g" s0 @" ?4 }4 V6 Fs = (buf & 0x80) ? 0:1;
6 o6 p+ f% b1 B' T8 P4 {s = s << 8;2 I5 [+ \  k% P4 q; J% @( W
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){+ o9 O& ~4 l2 V$ x. H
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);' F+ O! l& p% n' M% j, ]$ ~
i += 3;+ b0 G3 C) D6 N( S7 h% [: A
}
" {/ w- ?5 h. z; Y# ~0 T) zelse{) k. [: g% e6 y; T
kc = buf & 0x7F;
5 ^, U$ t, ]! g. Li++;
; p6 x- C$ D0 O, V}
! g# Z8 _8 r! l  z" n0 U}
! |+ _3 L, r# _0 n+ f% {% N2 `/ Bkc = s | kc;
! t5 C3 R9 X: u% F3 ~! c9 d: ]8 Areturn kc;   E9 R  j: j+ e# p4 I
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:42 , Processed in 0.082346 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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