找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20137|回复: 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。
. p: P3 q5 _8 Z3 j  F: y) ?Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
" p3 q8 P# _( m$ ?1 [以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。0 `. t- y# w/ ?7 Y$ |! S0 N5 J
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
; G; u0 {$ H9 x键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
7 ^& d+ V- v+ p& S7 O  q% h另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
" S4 o: l. d+ W7 e) r, F# y" k5 ^( e+ x7 g+ U
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
, r( y! f5 z+ I) X    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。8 w) b/ F: x0 c' b

; x8 M+ F( L# F  L- K& p    请高手指点一下。
" F/ e0 f4 O1 Q% J4 p
: [" _2 ]7 b$ A5 g$ p" `    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 0 ~% T' ?% l3 Q5 d+ t$ p
#include <string.h> ; C- L' E# |7 F8 q& S
#include <errno.h>
$ u/ J" v( j3 N% }( `7 @( {0 T#include <unistd.h> : o5 N2 B$ e, q% k
#include <fcntl.h>
1 J7 A9 o5 R6 O6 y#include <linux/kd.h>
: B1 F- u8 B) N) p' B#include <linux/keyboard.h> ' N  M- o  M- Z; U' a
#include <termios.h>; J+ o4 H, H' N6 f0 X
% A6 ]/ @+ i' m& M: q

3 I: {6 @0 b2 K#define KEY_DOWN 0x1004 \: h* `$ e% I( v/ K
#define KEY_UP 0x0002 l0 r! H( t% M2 b9 r

; @% m! H% B, N& Y/ Z2 {+ }3 D# |int oldmode;) N; A% x( k; I9 i( u  q/ b; |% m
% X# {" Z. `* y" p
struct termios new;! q1 J+ |" m1 ^) u5 y$ f1 A
struct termios old;* w1 M& T, J- O
0 K+ L5 Z! o& U& R
int get_key_input(void)& K: c3 G0 {+ K$ y7 H: A, }) r: _& b
{% [5 K+ f' `! X% ]0 _) M$ C
int keyboard;, m) k5 m) U, p( P6 [# \/ d. D, o
int keyboardcode;) g# M0 E: K& C- z* ~4 s
' C$ M- q7 Z. N' c. u
keyboard = init_keyboard();
  F% f3 c0 Z8 Y; v/ |do{+ L+ x% H- T5 \  G7 r, ]' ?9 {
keyboardcode = poll_keyboard(keyboard);
3 d3 Y9 u2 P- U' o  g: h- }if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
" W: T- i6 V+ \* g& nkeyboardcode = keyboardcode & 0xFF;+ ?- G; i% @" F$ D1 |
//( F) ~0 v6 [# d6 @! j
}
& B/ T1 ^8 o* a( w) L$ u4 ~}while( keyboard != 0x58);
2 a* z9 {3 |5 b" X9 r# X1 _exit_keyboard(keyboard);
/ Y$ h/ `( Z9 @! {! {1 xreturn 0;
: R1 u" ]2 @3 m2 a0 z6 N}2 l! p3 o* T8 i/ h8 L2 h$ ~  E3 g7 z6 Y
# e8 ]! v  s! j/ n
int exit_keyboard(int keyboard)
: v9 b3 L% _. e' n+ B2 [{1 ]: c" i+ `$ r' s1 |
ioctl(keyboard, KDSKBMODE, oldmode);
8 T  n5 j/ W  }6 h& k3 P$ Rtcsetattr( keyboard, 0, &old);
9 F& H. x3 }) s5 n5 |1 Hclose(keyboard);, a) @9 x! V5 W; H
return 0;
! J% F+ n* T& y4 S% ^}
" f$ [) c/ Z+ M) Mint init_keyboard(void)6 ^3 E5 ^: ?& x% X% r/ u
{
; ^; R4 l$ Y) B2 K5 y( t7 Tint keyboard;
1 J. i) j" T' c2 \3 D8 y" C
. R1 a9 E9 u4 I# o4 L% |1 ]keyboard = open("/dev/tty", O_RDONLY);
/ x6 h+ x3 J0 fioctl(keyboard, KDGKBMODE, &oldmode);
/ M0 }* s1 i+ j/ D' k7 J) Stcgetattr( keyboard, &old);5 _. S$ C. q  ?/ G3 N. d
tcgetattr( keyboard, &new);
0 |# \0 u9 h* o- O$ {# ~: K4 h9 I5 U8 ^" j5 r  b. W
new.c_lflag &= ~(ICANON | ECHO | ISIG); , |  ~6 N: I& W- X0 ]: ]
new.c_iflag = 0;
+ Z4 S- `( l1 Mnew.c_cc[VMIN] = 0;
6 O. R! M. e& O# d  cnew.c_cc[VTIME] = 1;& h  x; i# T6 F4 j$ R

' E5 x. C, a1 ztcsetattr(keyboard, TCSAFLUSH, &new);5 L5 [" ^5 s5 r% G! ^( n5 r
ioctl(keyboard, KDSKBMODE, K_RAW);) U' z9 O5 H: M7 @( r4 J4 A

8 P3 r8 P# _, u7 l/ n+ [$ Mreturn keyboard;0 N$ x" x- K* o' n/ {$ u0 }0 C

& ^: v7 g  r/ f1 D: G}
  L6 @' e" D4 A  b
( K1 e% q+ H+ oint poll_keyboard(int keyboard) ' \2 h) \- m* Y
{ % w, G" x, t; L7 w( O/ z7 B* v
unsigned char buf[5];5 w6 a& G5 k8 o1 Y" d3 U
int n;
$ G6 i* i  G3 |: a( P4 L; k
! u2 `# M# ~( ]( L" eint kc = 0;
! s/ i% b5 ^, p) Aint i = 0;
$ _2 k- b/ s, X7 _int s = 0;1 X9 Z' d* V% |  {9 A, T. `
n = read(keyboard, &buf, sizeof(buf));
4 g; Y" {6 z) a# G1 [while( i < n){8 j! ~* g2 W4 q( r' |
s = (buf & 0x80) ? 0:1;
* F8 \9 t5 Q( _4 F% L) D+ `+ c4 _s = s << 8;6 u  [3 Y3 d. \6 S4 J6 T
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){. \5 J+ t  w( R' ^& O) G
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
4 ^/ \$ z5 x2 y% e3 c, G7 Xi += 3;/ w8 ~% O. C. {- f% e, L
}# L& t: E- Y3 @' o, _4 S) d% a
else{
( H3 ]$ `$ S2 U. A1 a( akc = buf & 0x7F;5 O' F/ S$ e5 P  p
i++;
; R' ~0 `8 V1 x5 g' ~' {}% l# K& h6 U. |4 u1 ~1 Y
}: a2 C5 v) l& x. h; X' u; B4 Y
kc = s | kc;
& J9 N2 \4 }" G2 W7 Z  lreturn kc;
" e. N' d2 L# M, i9 [  E}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:41 , Processed in 0.039919 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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