找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20422|回复: 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。
) F# P. o& l* V! n4 m6 F' A5 {Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq( f; C: V- M% w1 l
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
; ^0 H  Q$ [3 v& Y4 Z# }3 I也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,, q* M6 b/ y, M& T& i0 G
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,* T+ z& u$ G8 G8 l: |- }, Z8 H
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
! H' n6 d* H; {: G4 O0 ]9 B8 w( e* q9 F& w. n
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
% F3 B0 K" |3 p; C    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
8 }! j- U: v, L
2 e1 t6 W, J6 T& j; y+ [* t    请高手指点一下。
+ U' D4 M: E2 u: l4 {, c* J- h5 q/ D+ H& a& `' o% @
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> $ n1 @9 d' }9 h( a
#include <string.h> 5 }# n9 U" M8 \/ E4 S
#include <errno.h>
& U$ q: R/ Y, e#include <unistd.h> & ^2 i' V; I0 P/ t
#include <fcntl.h>
( }7 h0 C* ]: a  P/ a; N& D; A0 w#include <linux/kd.h>4 p6 h0 i7 O/ c( k3 I2 s( O1 Q! h
#include <linux/keyboard.h>
# t6 |+ [( z0 p9 @& J. ^  R- g/ y#include <termios.h>. e) ^2 o( ?* {/ w6 k; `& r

" S) x, P/ ^; `8 [! \1 F' D" }2 y$ \5 T5 w
#define KEY_DOWN 0x1001 X/ [$ M1 ~  B. K0 |) X1 F: J
#define KEY_UP 0x000
8 r. ?: R" D2 n! X" j# [& W: z" L
int oldmode;1 M( l# X# C) O6 R% a* J" }

' ?9 Q5 H3 T% z; K4 u# E, Xstruct termios new;
" [7 ~* \( v/ W4 lstruct termios old;6 P5 q2 z3 I/ `6 o. k
2 ?3 F) H% F2 o$ T7 O3 u
int get_key_input(void)
+ A: r* U0 B3 _+ w" V) O{2 x! h$ ^1 |) ?1 E  {
int keyboard;
( H) E2 a% B9 v8 {int keyboardcode;
  Q7 N' @/ A& I4 Q
; d3 {$ H8 p) R; f$ R, P$ pkeyboard = init_keyboard();
/ V$ E& ?) `7 r9 A9 rdo{
/ |% _0 d6 y0 D' o/ M2 R3 Hkeyboardcode = poll_keyboard(keyboard); + t; \5 t2 @- q6 b% x% G# }3 h
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
8 Z, J" s# p% ?" w0 x5 Ikeyboardcode = keyboardcode & 0xFF;
! W  [9 q+ \# f' q//
1 S- J4 C( V& h2 L- D( {7 S% T  q+ f}
, z# I! N3 h; P- ?}while( keyboard != 0x58); 0 I4 A9 ], V3 D% E  R
exit_keyboard(keyboard);
. B$ b8 j" o" z, g, R9 z" b6 q; J7 Dreturn 0;' f, a) r7 A. D  {0 w
}* b3 u4 I+ A9 |) O8 t. M: y
7 I1 I0 `7 I% A/ i/ |
int exit_keyboard(int keyboard)
9 B  N! `6 y  ~1 x{
+ U/ a' ~) F7 p8 r/ Zioctl(keyboard, KDSKBMODE, oldmode);* r# G: o0 L% K; d' [0 J
tcsetattr( keyboard, 0, &old);
# P3 ]3 r) U+ q) e" aclose(keyboard);
: A1 |; m. ?4 q) areturn 0;* y1 R1 l  C7 T# j' J, u8 O  n
}9 F6 Y) Q8 y7 p$ I
int init_keyboard(void)
+ Y3 x" x$ `  @9 G; r{: ~, d" G  i* K! a* |
int keyboard;, {; ^. I% O# Z7 L/ v% A7 ]( u5 |

1 e% q) D- V" M7 a* hkeyboard = open("/dev/tty", O_RDONLY);& G& R; m# a- l* g5 W! @4 J; w
ioctl(keyboard, KDGKBMODE, &oldmode);" g: W% \5 u( Q; X& x# n
tcgetattr( keyboard, &old);
6 m  e4 n( W6 K) c* u3 u. k3 p6 `tcgetattr( keyboard, &new);
2 z% L' g" i% ?) C# {' a" h' N$ B  |0 d4 H) E1 [$ X9 W
new.c_lflag &= ~(ICANON | ECHO | ISIG);
3 i* }, |/ M/ k" H; enew.c_iflag = 0;# Y8 K/ k7 E' r1 ]; J
new.c_cc[VMIN] = 0;/ a# z' ?. b; L  w8 }: ?6 @
new.c_cc[VTIME] = 1;
+ i# u: H, T* r8 z: z4 ?% r- r& J9 T8 R
tcsetattr(keyboard, TCSAFLUSH, &new);' ?) P5 L# f' M% q4 ]) `7 z
ioctl(keyboard, KDSKBMODE, K_RAW);
+ {  Y2 Y) U+ g0 N- B" J  D
0 a  \. s$ N* e) n: u  {2 dreturn keyboard;7 P+ Q1 l! G8 F1 v- W. i2 x! G9 ?  ]
% H- H# y; t& p7 Q; A& y' G
}! u3 `6 q+ N8 D9 @, n& M. e

2 E% C" f6 `8 P4 M/ `/ }int poll_keyboard(int keyboard)
1 A2 L- ], \) K' g0 x{ 8 B4 T2 m8 ?* y( s
unsigned char buf[5];
' n( \) J3 _* C  I+ y1 `3 zint n;
: \6 n4 O9 H+ `6 x4 @& j
( L0 O6 {/ H/ G8 |- Jint kc = 0;2 @( E# i, D; y. ~
int i = 0;( x: t4 y/ J4 T  V1 U. c
int s = 0;+ L/ w. x5 p! `, s
n = read(keyboard, &buf, sizeof(buf)); 7 X" R0 f, a# e: v$ p/ Q
while( i < n){6 \. |0 e9 D0 \5 s! S4 b
s = (buf & 0x80) ? 0:1;$ G0 v, ?0 |( E/ ]/ {
s = s << 8;5 }, I7 @- |) M  ^0 N# H
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
& G# J3 I. J9 Ykc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
# x* O1 m# s, q. R. A1 Ei += 3;3 k$ u( r3 Q. k: F6 N* E; Z1 p% q2 {
}% e+ Y4 q7 B+ r# j+ Z$ l
else{& \; h5 ?" `# R1 [# ^2 _8 e
kc = buf & 0x7F;' r1 J/ l! C- v" D1 ]. ]# R
i++;
4 v/ [$ O3 e$ W5 n$ c/ y  K}
+ C% r0 V1 R, P$ G}
+ G8 U- n( D6 ^2 x/ h! gkc = s | kc;5 T1 |6 g- C, l
return kc; 5 W2 ~/ R+ `* A# ?! p7 J
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 19:04 , Processed in 5.953679 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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