找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19682|回复: 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。
- k) U5 f& E; Q  H1 l2 d, }Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq) C% \5 b& d. Z9 A  A* `
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
3 ]4 w1 e, p# m  f' x& k也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
# J) t/ S& f; C8 J键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
6 t! Z# V) @" m. `6 g另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
9 e1 S4 l. ^6 Z8 B3 u4 I; C4 T/ y- R! {7 Y" J7 `2 i& `# u
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。) y( x4 |( h! ?6 W0 d
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。6 }- g6 S+ Y4 E' F% N% |* `

* ^  r5 a% ?* f2 m" a6 r    请高手指点一下。/ a% ]. N- b& V4 u$ C$ q
/ w% O- P  m2 i! t! ]8 R. q
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> $ w8 v* {% o3 L, S9 j  v3 M- N# B
#include <string.h> ! Q  d% _& b0 L# O; R
#include <errno.h>
4 B0 q) R2 o6 g6 l) T7 a#include <unistd.h>
! P' {1 N+ N4 L" F* M#include <fcntl.h> . G: ?8 X  v% `' _9 s9 W! J0 [
#include <linux/kd.h>: h, B3 C6 t* Q* i7 F
#include <linux/keyboard.h> ; j6 S! l4 I/ z& y' n/ H! V
#include <termios.h>% M( }2 W+ {- r5 i
; t/ a8 `: ]$ N4 O+ y, J. F

+ O2 `8 s" [5 O( i: [- U#define KEY_DOWN 0x100
. a5 K: w( a/ I+ R% i+ `& q#define KEY_UP 0x000
% e3 k, m( b% `5 S- G
) [" K+ e/ h" h* F  n2 `* c; Sint oldmode;
: ~7 j$ N8 U! n9 {) j7 `2 w
6 b0 f! R+ y6 z, L$ }/ U; ?struct termios new;
5 d; K2 r( L9 W  |% p4 Ostruct termios old;
+ l. R9 L! R; v2 ]5 p
; B+ X5 \4 g, F1 ~: l6 Wint get_key_input(void)& q. T8 X3 e$ k+ h
{. [9 l  I9 L( d
int keyboard;
" C! K! R6 k' K# J% [+ f, Yint keyboardcode;
! \% R0 ~7 y2 @- d: D; ]
7 p) `- ?8 S  ?& H+ e  ?keyboard = init_keyboard();
0 }9 Q. w& X3 y- xdo{
8 U3 n5 J( q6 ^7 Y: S& ]keyboardcode = poll_keyboard(keyboard);
2 K5 v4 V, N% ?' W+ }$ }0 a8 Y/ ^if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
, T1 b) x) A) [  O8 hkeyboardcode = keyboardcode & 0xFF;
! k4 M9 i- {# T  `6 K& Y2 ^+ m7 U+ e//* b% G1 v8 J; {' J/ c
}4 V0 \3 A! J1 l" z( g, l
}while( keyboard != 0x58); ( m/ z7 ~# h* a6 k: l  F/ N+ M
exit_keyboard(keyboard);
7 C8 p3 p3 b* i5 E) sreturn 0;: j8 B$ m% x! w9 _
}7 J8 S! z7 r: ^( y2 {% n

2 X' N. B4 [+ x" U2 Y6 \/ Pint exit_keyboard(int keyboard)
2 u+ @& B6 o& n9 r# C2 H0 U{
# W9 Z4 b$ y6 J  L5 Oioctl(keyboard, KDSKBMODE, oldmode);
. h# I* C$ t$ l7 }8 f6 Z/ T$ v# ?tcsetattr( keyboard, 0, &old);
9 s: g. w* _! S) G2 y! J# {close(keyboard);
. r7 F3 u3 K: ^) D  d) \$ Vreturn 0;
& ^, C; N* ~9 ~  V: |}
& F+ U' H) P, r+ iint init_keyboard(void)
/ k; {2 w4 j$ _9 v4 f2 _3 s{; [) D$ t/ S' E/ E  M4 t
int keyboard;
. x1 g# H% s0 O& ]7 L7 {8 p9 x& }$ }( A1 T3 G5 p$ }# J
keyboard = open("/dev/tty", O_RDONLY);1 }& {; R+ ?8 C1 k' I7 ^: A2 k8 e4 w
ioctl(keyboard, KDGKBMODE, &oldmode);
) v& h6 u9 T' Q* xtcgetattr( keyboard, &old);! O2 I# B5 m! \
tcgetattr( keyboard, &new);" j' M' N& I, {2 z9 T

# {. t5 m; ^- N5 O, Dnew.c_lflag &= ~(ICANON | ECHO | ISIG);
  G1 N- N/ ]6 w" k: qnew.c_iflag = 0;" m9 ?/ M8 U$ R9 V9 O* P
new.c_cc[VMIN] = 0;
; L8 y9 Z4 m8 x+ B4 \new.c_cc[VTIME] = 1;* N3 `% g& c: [) H5 k; r3 c# g$ w

, k; ~: c9 h! u  V% @3 Z' o+ |tcsetattr(keyboard, TCSAFLUSH, &new);
" I7 ^8 A2 E) s& G' ]ioctl(keyboard, KDSKBMODE, K_RAW);+ E) f( z% W. p! P) J  S2 p" q  D

( U4 q) ?+ G! Z) Vreturn keyboard;# ?' N. I" L  u, L: @! @

2 \$ ?7 R: u5 j/ m' h3 c8 j}, R4 O. f1 p  W1 }$ U

$ N3 f6 X& P( v. C& Kint poll_keyboard(int keyboard)
$ T% _5 _* R2 o2 Q8 i( N9 ~' d{
  _9 Y5 ~7 S& a4 p" yunsigned char buf[5];1 L/ N7 X6 q9 R: q9 f5 U6 i
int n;
2 G( k$ E: G, N' ~) y9 O6 C7 X5 J- U" k2 b/ w' _
int kc = 0;
# t' y) T3 h* c8 k5 |int i = 0;
; ~, V3 F. c1 r# z' Iint s = 0;
) s, [# @2 t2 Y6 `n = read(keyboard, &buf, sizeof(buf));   P+ Z: W8 J# {; r
while( i < n){
2 Z0 D/ f0 _' ts = (buf & 0x80) ? 0:1;/ E! w$ D( U2 H: ?! v
s = s << 8;( H! k% i# L& z6 [
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){  @, r- p2 x5 h1 H4 q2 X- O
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);4 D% d2 Y1 D0 Z! d+ _
i += 3;
" L0 x. P# `7 X" m8 m. |7 [}6 c2 x. G9 g9 A' l( ~
else{" }% H7 n/ G2 C& r" r! a2 o
kc = buf & 0x7F;' c- X1 G! Z5 ]# V9 q$ O
i++;% s; b1 q! p9 D: Z- }* t
}
6 W8 |$ b, u  K: v; X7 k# n}
9 R, F& `) J, U# S0 e) Ykc = s | kc;3 N4 B( E" y  ~
return kc; 2 O$ u/ D  [+ Z: I6 t8 Y* ]" f
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 14:00 , Processed in 1.834473 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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