找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19143|回复: 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。
* `; \/ c- y1 M8 G8 J% L; p* \* p) P3 ]Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
; G# p6 y! d# n5 I4 J, l以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。8 ~3 b) Y1 y' \) X! F: R
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
% R& c7 f  u3 d) P! A' N9 r& N键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,4 K0 u" y0 |' Y# }- _
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
) Q0 n' Q; k( ]; e
( a+ `1 K, p5 K) [. c    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。% m0 j, w* t+ ?- u' V
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
. o' t% c2 ^1 \8 I3 G9 e% b  h' M+ O5 ^8 g, y
    请高手指点一下。0 G9 b% ]" T% P/ q# x
. s! {! h$ N4 {& B  f0 K
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
. E* R% Y/ A  V9 \#include <string.h> ! E7 w' d- U2 W
#include <errno.h>
' B$ F1 h3 e& @. Y#include <unistd.h> 2 _) z, [% S  q* v3 E( s2 }
#include <fcntl.h> 0 V' o3 U2 K! n2 U/ ^. s
#include <linux/kd.h>3 M" g" I% y7 t- \
#include <linux/keyboard.h>
9 Z& s  f7 x4 t#include <termios.h>
" J7 U  M& X- K( b3 |+ t
, N$ _2 t: q9 W' j
" \- c' `8 `9 P9 k$ [' h0 |#define KEY_DOWN 0x100
9 z, {9 E3 B: A3 k! [- Q#define KEY_UP 0x0003 D1 `* V  J6 e- v0 V3 L- c) {# J
2 ^. \& s& i/ p0 f& ~! c, _, U
int oldmode;' `  E4 m7 o7 u" ?% o

( `$ o& b+ y8 q2 d6 @struct termios new;
, F/ W* b' o( ystruct termios old;
; Q3 @. Q2 C: n# P3 n- @' P; ^1 `$ E$ d0 i1 K7 `; b. G- F
int get_key_input(void)9 a1 h$ P( k3 x5 A+ \8 B
{
8 S' M+ u4 _6 @3 Vint keyboard;
1 k) A* {, F. I1 C" \; @int keyboardcode;
5 y; b& I& _+ Z9 q3 S% D, d" d! @+ u8 S* F2 s
keyboard = init_keyboard();
! ?) q6 N& h5 k# I2 D& V* ~9 Mdo{
% I$ I; H* L- T5 }& [5 P% o0 o. j( U. Ikeyboardcode = poll_keyboard(keyboard); * f6 i8 I6 V0 a( K4 I" r
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
- h: u6 s/ [& pkeyboardcode = keyboardcode & 0xFF;
( o1 g' J; K/ F6 H$ Q4 _//* s3 F+ A  u$ T; l- V5 j
}, p6 P4 p; L" V/ v
}while( keyboard != 0x58);
& Q" C# x: U; {5 _4 l  D4 nexit_keyboard(keyboard);
: Z3 r, a7 k0 q4 ]return 0;2 l( S/ G0 g$ B' [: O5 V
}" h& M& t: F" ~, z$ k

8 }4 A0 w$ {, y! g& C" }  Gint exit_keyboard(int keyboard)
$ k, b% u( `9 J( ~# D{
% i; U) L8 S8 ]. Q2 @0 U5 v% |; nioctl(keyboard, KDSKBMODE, oldmode);. j; C3 r5 J. Y# F* P
tcsetattr( keyboard, 0, &old);# e/ D7 d/ b2 R! f. }4 C
close(keyboard);: |% \+ ?0 U% G" Z
return 0;! q4 V6 L" u& P$ b
}
2 }  J3 P. y5 T; \) O% `int init_keyboard(void)
  F( L  g+ G3 Y5 o4 m{# y! j2 p. \5 X5 b7 Z
int keyboard;8 ?) Y! j: H$ r) ^

$ h* I% _/ E: _2 D! s6 ?: X% j; r; Ukeyboard = open("/dev/tty", O_RDONLY);" u4 f# U) }3 l" H4 x/ T5 a0 x
ioctl(keyboard, KDGKBMODE, &oldmode);
2 @/ E+ Z- x- \/ [tcgetattr( keyboard, &old);
( e- }( P4 B& _1 i2 ^tcgetattr( keyboard, &new);
" r5 A0 z( _2 O
. v, ]/ m' R! S; K* S- ~6 tnew.c_lflag &= ~(ICANON | ECHO | ISIG);
# a" w" o4 S( l8 @new.c_iflag = 0;
" h) L. X6 ^8 t+ {0 g' n5 O0 gnew.c_cc[VMIN] = 0;! e6 N. @7 ]6 c. G  |
new.c_cc[VTIME] = 1;
# j4 x  W6 h0 J5 y. f
- q+ G0 B/ h9 N6 P% V1 Qtcsetattr(keyboard, TCSAFLUSH, &new);9 x. W$ G% p1 ~
ioctl(keyboard, KDSKBMODE, K_RAW);
' u4 h% ~% n, n6 ?: l9 b9 K: I/ C5 Z) l" l6 n
return keyboard;
8 j1 B( l: z; ^: Y$ r
$ v7 F! n0 C' d}
5 X. Z) r  k9 m% _
( L: G6 _6 [* Nint poll_keyboard(int keyboard)
- ?. l9 b/ h, w{
0 z: X* ?* I8 w# |unsigned char buf[5];' a% m& I* B% T+ @- C$ V! F+ p* L' @
int n;
" [0 C$ Y0 P: f2 q6 v" r3 K. w8 `+ [+ W" [' z* i7 r
int kc = 0;( G& v7 K4 C$ K, f; m2 n
int i = 0;
# C2 @; v' i6 [% B5 c% }8 Pint s = 0;
; A! g8 G$ q; X3 P  Fn = read(keyboard, &buf, sizeof(buf)); 4 O% e# F8 G" l5 |" d6 q, c! H
while( i < n){
- i- u+ B. K+ Y/ z4 ks = (buf & 0x80) ? 0:1;
* b# n& s# e8 n" js = s << 8;
& B" g) b; U" [1 t5 }: n0 B5 jif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
( ~1 i3 x* x( l& ]3 k- p4 Xkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);- `% c  i6 {' u/ W; G5 i; C
i += 3;
1 l3 l1 @* @0 _, ~7 ~}/ m. G0 l& K; }* w2 h
else{
: }9 `# o% T& s0 b: o! K! b9 ^kc = buf & 0x7F;" Y! u. W% c$ n5 p" S, R1 P
i++;: F  v  e9 Q0 U, J) O3 u
}
, T' O' P/ Y+ Q, z$ @  K) h4 n2 r/ n}
) N, D, V2 P) `: A& Akc = s | kc;- ?  e; U+ m$ |5 N! o* Z
return kc;
5 k9 h! Z- c: j- d}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:39 , Processed in 0.028324 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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