找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20264|回复: 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。
4 t& Z) x8 `# R( p/ I8 x6 M% bKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
7 f5 ?# t" @, S" O! ~以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。( h  e7 J$ y2 Q
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,. {! T. Y2 l* q4 p
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,9 l. J% |. P+ _, k7 s+ _
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
5 Z2 l+ F4 ?: }& N1 D% m% E$ c1 q- j7 R! z3 A  W- b4 p  H4 g1 |
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。/ u; V  c7 K! s3 e
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
3 `1 Z0 w# a5 ?7 ]
+ |9 S7 B: e3 _: q( y# r    请高手指点一下。! k; M( p2 b$ H& u. \' U/ G4 _+ o2 _
% t: r: Z( w3 H" r. v6 Y* p
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
3 J& p: ^1 I8 r#include <string.h>
0 ~, {% {. z: M' u- q' B  w+ g#include <errno.h> & r, y3 \, p8 I6 U
#include <unistd.h>
, l2 A( i+ ?% G1 k0 ?* J' {#include <fcntl.h>
0 [# m6 Y4 q. Z% `  z#include <linux/kd.h>; K* U: P0 g1 c  k; e2 \
#include <linux/keyboard.h>
% X4 Z" Z5 L; `# G# [( A) p#include <termios.h>+ @1 p' R7 Q% j0 G
9 z1 {# ?. D9 S$ K' w1 H4 d6 O
/ v3 k& E+ [7 w: F+ O2 i1 `+ x' J1 [! r
#define KEY_DOWN 0x100
* a2 T; Q2 r1 h8 Z& b#define KEY_UP 0x000! a+ Q  X1 ?2 o4 V

) G; f: P* X. i, J' Iint oldmode;4 X" R$ ]) A5 S* \

! A( \7 z4 Y" A" R. sstruct termios new;
" j! B5 m# s7 J* {& B( ?% Cstruct termios old;
1 d  V; M& `/ Q1 F% a' C" B( ]! Z: \$ o8 n. ^
int get_key_input(void)
+ v" H# o& F# {{
6 M& j$ X; L  p2 Z7 Y( cint keyboard;
% y- J# f" ^0 Gint keyboardcode;! h# W; k; R. ~) G% k1 h
% c- G2 k2 K& g5 q  e' e
keyboard = init_keyboard();+ ~% P# _4 a: D9 K4 Z5 p
do{
- W# Z# z* K, r) I0 ^: fkeyboardcode = poll_keyboard(keyboard); & c% M! }2 r  i  l: @* E- F
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
. `$ D0 G  [5 r1 J7 ]9 Y& D  hkeyboardcode = keyboardcode & 0xFF;! o; Q+ Y9 S/ p
//
! [% {  b$ ^0 U# Z% e& W}  w+ @# V6 p+ c' T
}while( keyboard != 0x58);
* F1 i. K" t7 b% Pexit_keyboard(keyboard);
# V6 v7 ?" d, C2 g3 Zreturn 0;
. c7 r5 u( `! K0 F) }6 Y}8 [: K: q  W6 f0 U! h* o' v
) k/ E! \' S+ I; L. Q1 k8 J/ B
int exit_keyboard(int keyboard)( t1 E. u. k, Z& w, w+ C
{
- L& i: d; E! p" Jioctl(keyboard, KDSKBMODE, oldmode);
- s! u* `( X8 Dtcsetattr( keyboard, 0, &old);" i* z( Y0 X: g( i; p2 B
close(keyboard);
+ c  i0 ^  {% q, creturn 0;0 L7 u: A. o  K) `* _$ n% Z- W  Q
}! W( l, o6 u! I6 x1 z
int init_keyboard(void)
; G6 ^1 z0 D0 O* z1 V( u/ n{
, H  _: }/ A4 k1 C, Sint keyboard;7 [0 n, Q6 j$ `' r7 h" }5 E
( E4 H) S, T! W& ]( @/ x4 Q  t- K( @) D
keyboard = open("/dev/tty", O_RDONLY);& u9 a: s' t1 }$ p
ioctl(keyboard, KDGKBMODE, &oldmode);2 Y& K- j4 j. |
tcgetattr( keyboard, &old);
0 p, c3 O# |) b- j  ?. g  dtcgetattr( keyboard, &new);
# _9 Q% C$ ~! B0 B' _2 |7 z* g, g% h) ~% I/ r2 u4 s" ?$ F% [' x
new.c_lflag &= ~(ICANON | ECHO | ISIG); 6 |6 S& N4 h" s* S: \8 N
new.c_iflag = 0;
/ [+ a6 N% |4 X; k# `0 Knew.c_cc[VMIN] = 0;
  B( x6 `5 P9 \% L0 Y! V- _1 unew.c_cc[VTIME] = 1;
3 H2 l  b* o$ d! k$ i0 \
: d1 W6 O) q* etcsetattr(keyboard, TCSAFLUSH, &new);4 p! Y" j5 ^; h% I* O
ioctl(keyboard, KDSKBMODE, K_RAW);
3 P: {; H5 [. U1 Y& l* t# Q2 l, ]0 ~/ ~4 A2 u# }6 ^
return keyboard;( }' p$ d9 d, |: S
% S+ y5 c7 r7 S% p1 O+ v( y
}
9 A, m' W: l8 B, F6 E
7 B# C  i6 o  W* G$ W; ~% Tint poll_keyboard(int keyboard) ! f0 }" E+ D( G  M
{
3 h, J( ~2 v5 l8 l9 vunsigned char buf[5];8 x" g5 _: N* e& S  p
int n;
9 ], T/ x+ w* s3 |0 l9 H( \9 ~
/ q6 U; s. m3 w, M6 f+ Uint kc = 0;
/ [/ z+ y7 o* Pint i = 0;
) Y, A8 i6 w, Q0 J* ]" m* ~int s = 0;$ ]  Z& Z# J5 u
n = read(keyboard, &buf, sizeof(buf));
9 s/ x' I2 e- \- m. S: |% |+ J+ vwhile( i < n){
8 L7 l8 a8 _8 Xs = (buf & 0x80) ? 0:1;
; ^; d' S% U: G5 Ts = s << 8;
, B$ L7 h/ J6 @" M1 f4 Dif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
0 @6 Y6 N$ K9 G* O5 Ikc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
5 u! D- r2 i/ s8 z& Q. Mi += 3;
/ l6 u9 e) t+ @$ h- w2 E1 c}7 l. P) x4 u. b: `$ ]1 e% T  ]
else{3 L: u9 B4 Y- H# e
kc = buf & 0x7F;" u, T# _- D8 e4 W# I
i++;' w- K9 ^* t. n. n& x. F0 q
}% I) u! K! F* t0 n# h
}
1 ^9 T' r+ u* J* _3 z& Kkc = s | kc;- M# s( ~6 _; Z
return kc; * g( H; z: b# d- c. X
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:45 , Processed in 0.044789 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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