找回密码
 加入计匠网
搜索
热搜: 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。% g/ n$ N( {; l7 O4 U, h
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
3 d9 B3 y1 H3 p# `- i. v以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。( z" I/ z, Y+ s1 e9 V$ T% |& e0 u  o0 D
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,+ J- T; L, V0 F; i: P. u
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
6 U; m  Y9 M* M8 _+ M# u另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。( l/ q- [9 {. D* j( l

4 R$ T7 ]% q# h    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
+ i. D; }( w5 {9 B- P* j    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
8 K" K, c3 y; U
! l/ H$ |9 B* E    请高手指点一下。
% x! P3 [" C4 O) d5 J, U) U0 |& U( |! ]8 R+ n6 t" b1 `2 m
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
  G, d; ^% g& j9 J0 B4 w) j' I#include <string.h> , U" e9 ~, k1 }2 P" f
#include <errno.h> . H4 I7 [' D7 G  g! v; p' b
#include <unistd.h>
. {* z' }: ~: G" X) o#include <fcntl.h> - M' C. o/ j" c& S/ E7 E- ^
#include <linux/kd.h>1 Q' j- [9 h; B3 _
#include <linux/keyboard.h> 5 S* M; o. O, L, G" w
#include <termios.h>$ c1 N4 I0 Z- v

) C: v. G# Z9 b; T# r& a! b9 y; K) E9 u1 l& h$ a
#define KEY_DOWN 0x100, z5 e  i2 J( {7 n
#define KEY_UP 0x000- R# _7 c3 `2 Z! Y/ U

2 ?( K$ m, \5 p, t7 Xint oldmode;
: p% `: b9 e+ S! i2 v9 l
  c" J8 {  |: i' ?2 Zstruct termios new;& z$ p+ {+ H+ H6 p' d1 e+ Z) B7 c
struct termios old;) }, V3 h/ U  O

) X0 b) _9 K+ n" Nint get_key_input(void)
6 F/ u8 R' P7 }+ ]* B6 _' w. c{
8 @' d+ K0 S" sint keyboard;
# ~  E1 [9 a# ~, K: Z  y7 Fint keyboardcode;1 x. y0 V" r1 d3 K2 L7 j
+ v7 q; {9 A8 N% O+ K
keyboard = init_keyboard();( b3 i/ N3 Q6 `  I8 a0 _
do{7 l" G) C$ b1 l1 f% m6 C* s6 \
keyboardcode = poll_keyboard(keyboard);
/ q! o8 D  L7 f) _7 a3 Uif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
) ^. J) C2 Q2 C  c" r& S5 Gkeyboardcode = keyboardcode & 0xFF;
: u; s3 E2 b) z8 u//2 b) W" O; i3 l4 i
}, C+ p! }' y0 K- O4 X
}while( keyboard != 0x58);
: b3 u2 v! ]- J0 [4 R$ fexit_keyboard(keyboard);: a* O$ C$ B/ h, U0 K0 `1 ^  O
return 0;9 y* K. c* X" P: l0 M
}
: ?% N+ y9 l& O. K6 X; L+ ]/ \# P+ K' \2 ]7 s$ _) `/ S
int exit_keyboard(int keyboard)! T) |1 H* y& |/ |5 l
{
  ^3 K8 p  u! `' H/ l$ \( B$ xioctl(keyboard, KDSKBMODE, oldmode);( P0 k' W3 d- E  S& S4 }
tcsetattr( keyboard, 0, &old);% e- g: J3 h$ {0 N
close(keyboard);% R, V4 f0 S- H7 _; b
return 0;
6 q5 o: z) k# b% j. i}" w, `4 p* x5 X' e* h
int init_keyboard(void)4 c& B. d2 {4 `8 m0 U1 c
{
2 E, k0 C  h) m4 h% Wint keyboard;
$ L5 W; y2 {4 {% ]7 ^7 ]  I( H
3 {$ T7 R, }4 E( n) Vkeyboard = open("/dev/tty", O_RDONLY);/ i7 v+ x! s8 R, M
ioctl(keyboard, KDGKBMODE, &oldmode);
- ^& O. h' W% Stcgetattr( keyboard, &old);3 u' c8 H0 s0 h7 Q- n) f
tcgetattr( keyboard, &new);& Q) i) _! M. C

& P6 P4 T: Z' Y1 inew.c_lflag &= ~(ICANON | ECHO | ISIG); * b9 }) C; n8 o$ L
new.c_iflag = 0;* q( f/ _3 ]& X4 H
new.c_cc[VMIN] = 0;* S& q+ Q" W3 G
new.c_cc[VTIME] = 1;8 G( e2 J- ^. `9 T7 k

8 w! [& Y- L: ^0 `8 j& q# K+ r, Mtcsetattr(keyboard, TCSAFLUSH, &new);
- o4 w1 E7 m0 u9 F* v+ U4 S1 Hioctl(keyboard, KDSKBMODE, K_RAW);
% R+ ]: f/ y& H, t! k( D( z# H8 B: R- _/ a9 `2 F: Q2 ~9 n
return keyboard;
3 i* W3 R8 Z; o0 W
1 |1 @. `  q! Y4 G/ d; {}2 T( y  ~6 z4 J! \% ]4 y$ q0 B5 @5 @2 k8 k

' V3 ]" l2 K3 d  C, fint poll_keyboard(int keyboard) / O! J  A9 _, |. A
{ 5 Z3 S7 K. v0 |6 O
unsigned char buf[5];- r9 w/ D0 o' @/ s% k
int n;4 L: x+ E* m8 T
' E8 D, T! ?0 v, ^# m
int kc = 0;
! c* R( e% j0 @& p8 O6 Aint i = 0;
& P( y/ r3 M3 Z! ]* x8 l/ Aint s = 0;
+ q0 b7 B1 |* m- @+ E" v& [n = read(keyboard, &buf, sizeof(buf));
; [9 ]9 |' d$ j  T  Bwhile( i < n){0 [2 o7 `% F* ?
s = (buf & 0x80) ? 0:1;
  N' ^( ^8 a' u$ O2 `3 h8 js = s << 8;+ O6 b" X! B; t$ j0 F- U1 l6 I" d
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){' [- G- a- |9 K, ?
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);; _6 i/ p6 N5 y" }' M. _* G8 E
i += 3;6 z* A& P. l' |% a! T5 N
}7 X+ s- W* @  D% b* W+ x7 a
else{6 C6 c6 u1 Y4 t/ I
kc = buf & 0x7F;: i* j( a; R6 l0 o
i++;  F4 p; @* B, P3 l" z: K/ \- N
}
* P7 m( b0 }- W. Q}
& }' c3 o9 d1 r7 h9 Kkc = s | kc;/ ~* L# v& P( n
return kc;
6 e8 j8 d& i( Y# U. l: C}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 18:27 , Processed in 2.195925 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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