找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18752|回复: 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。
2 h2 B  w5 V4 f: \' G% ^0 ^5 P9 BKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
& ?5 u3 S4 a0 C' E) _/ w2 S以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,3 _# T  {# ?: P* d) p
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
( N9 g' |# j" R1 \1 N另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。1 l# `+ |! c, j5 ~( O
% a: s9 D4 [' r5 v$ m" A% K
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。8 R: l8 A, R5 V
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。  {" h7 v5 v. v. X1 r7 Q

& _- e, s! Y/ \0 Q. p. g    请高手指点一下。. N$ R7 |& l! [
" z( g* b1 }' K. i
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
, ^8 n2 q: M: r1 T: r8 u5 g#include <string.h>
) }8 ]) C; a0 s% s' K#include <errno.h>
  ?5 L+ X; L4 h#include <unistd.h>
" K  n) C2 ^0 c% e* ?#include <fcntl.h>
8 Y% O! u3 s9 u! z#include <linux/kd.h>
# o7 C% g6 i. R9 b8 g4 x6 S! Z- [#include <linux/keyboard.h>
5 C' F* V' K; z#include <termios.h>9 L9 P! ?/ L9 o" k% b2 q

9 Q( ^5 s# k' i4 a8 V) `3 G, h( y. u* V1 Q/ @; }
#define KEY_DOWN 0x1002 y6 n  }2 d( ^6 ?- U: T
#define KEY_UP 0x000+ u+ {# _4 g; z; P4 V1 m' F, J

3 c5 a  `: K  J. Wint oldmode;
; I& d0 S7 s- J
0 |* Y/ ], P! Q0 A6 kstruct termios new;
0 g8 N; {" ?* lstruct termios old;
2 O' h: n3 u" q; S5 \
9 h0 l! ]( ]  u$ pint get_key_input(void)5 T' {" K8 c: l7 i
{& y, ?$ j7 C7 f6 X: d/ N# T- Y! V
int keyboard;* I6 Y( v+ b, o5 B* O. @9 g: X, ]
int keyboardcode;! p( f5 J9 ~: W, C- l3 u: z- C

0 k- k2 |) K7 o8 Fkeyboard = init_keyboard();( N1 ^: z0 r  j6 D  g& R3 E, F
do{) d* T+ Z* }! A% Y, c
keyboardcode = poll_keyboard(keyboard); & k8 V% m3 H( X! \) v4 _
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
: N+ L; I3 m9 C& R$ I' v9 |0 V$ |2 wkeyboardcode = keyboardcode & 0xFF;
! f3 H& [) u/ Z, ~7 B( N//
, k. f/ [, V/ ^) H( N" t& G8 K}- p4 c4 i* z6 @3 `: q3 Z" h
}while( keyboard != 0x58); 7 s$ [6 }! K. C6 M7 M; i7 F
exit_keyboard(keyboard);+ U% V: z/ @0 Z9 a0 j
return 0;0 \* B1 q0 L6 I- y
}& u9 s2 V! t# B2 r

. f$ |2 X+ a( cint exit_keyboard(int keyboard)
/ W+ w3 N! g5 u' s9 \# \{5 v5 M( D7 W% g
ioctl(keyboard, KDSKBMODE, oldmode);
( l# @( c' w7 p4 w) c7 _# Q+ etcsetattr( keyboard, 0, &old);, o- T6 `- e( G
close(keyboard);
  F, ]/ k3 N7 t$ `7 breturn 0;6 F- z7 n3 r% c3 S
}
! \+ ^, C8 j% {* i* c8 J% hint init_keyboard(void)
* B; v2 _" }& h7 Z6 U{
( h% o5 d4 v3 f7 Nint keyboard;
. G, l8 s/ e, |- E7 h4 z9 L: ?5 Y: K0 s2 J
keyboard = open("/dev/tty", O_RDONLY);
2 ~4 O: |1 [; q  Y7 X, Qioctl(keyboard, KDGKBMODE, &oldmode);
; d( X0 p7 F' _& p2 Otcgetattr( keyboard, &old);
) |( C( M2 S2 ]7 stcgetattr( keyboard, &new);
! u' X& w# C) g: q8 i  a$ e# G* g0 X$ ]) ]. u2 ]9 d) H" M
new.c_lflag &= ~(ICANON | ECHO | ISIG);
5 L1 M& ~8 |8 O8 Rnew.c_iflag = 0;
) K: C* `5 O  Vnew.c_cc[VMIN] = 0;
) i& \! U- s6 d$ E. Tnew.c_cc[VTIME] = 1;
8 Y: e4 q( V* N9 g1 R% S9 _$ }2 |, E) J+ k& j1 o
tcsetattr(keyboard, TCSAFLUSH, &new);4 a/ S4 K4 n% l) ]! r5 U  V
ioctl(keyboard, KDSKBMODE, K_RAW);
* ?. l. l: t+ K- @/ T- d' _2 L4 H
* @2 u8 ]0 x6 j! \; ?) W2 d3 `return keyboard;. J2 j! P* _2 L  H, m4 X8 H
$ O* ?$ y7 E$ V  k
}! u# T4 ?2 D3 E( W5 C2 t" X4 h
4 A# ^' m, O+ ]
int poll_keyboard(int keyboard)
, `" ^9 e8 W- `{ , Q0 }1 k+ I3 r. y
unsigned char buf[5];0 k) n2 J) {( h
int n;8 F0 n9 L- Q2 R6 V, j' y

5 b- A% F: Z- p7 h! zint kc = 0;& n: J* [# n9 P( @  I  C( ], `: X  M
int i = 0;
* R. x* \! l6 X1 @8 bint s = 0;9 l3 w0 P# g* N7 \8 m& r( h) d
n = read(keyboard, &buf, sizeof(buf));
) p0 v9 l5 @1 z9 w- N7 [8 b4 r2 G" Awhile( i < n){( r8 a9 j  g& Y. x3 m8 X# z
s = (buf & 0x80) ? 0:1;
% Q3 A" j1 P5 c3 ?s = s << 8;
- O7 g. j" {7 x8 i  @if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){( G5 f8 J" e# J' N& R- z$ e1 ^
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);: G' Z- t8 P. Z* G2 ^
i += 3;
4 y2 W& p/ ?( [# l/ {% D  @% I" ]}2 h: H; W, X" j. a/ f
else{  a8 r$ K& |; U$ N5 @/ o# ]" \
kc = buf & 0x7F;, r8 H$ E! V1 L( k% k
i++;4 x' L7 s; S' O2 \
}! Z0 R; g9 k; K- h2 e
}
3 ]; c  W2 ~9 r, ]kc = s | kc;, ~* A6 l$ B( ^3 O
return kc;
% o8 S8 V1 E- }( |$ ]9 w2 f) y}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:42 , Processed in 0.042178 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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