找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18998|回复: 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。
5 N' l2 N# B& p# E- `9 FKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
3 L  S- t% e8 g6 M$ n7 J( \  r以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
+ ?* h5 b7 q! i3 H) C- q4 Y5 V$ V$ p也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,  p! w: d- _8 n; w1 i  S" F+ B4 E
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
* q# l" F. s/ ]% W另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。# b& j+ P* W* m4 K3 W- ^# M/ @
- X' l5 m# h# S& |) l' X. R
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
6 T. n. I5 B7 E8 s! H6 S# F    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
: r$ L2 k0 j) q) T1 i
. G0 h- J9 ~; c$ H; n* Z- ^8 W/ t8 \    请高手指点一下。
3 Q4 ]: u( g1 }! l  z9 {) ]6 y. h" b6 P$ H  ^4 w/ `
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 3 `, _/ v- U' w
#include <string.h>
; ?, T' \5 _/ O  i- o- s; @, d#include <errno.h>
' s4 ]$ I  [6 j#include <unistd.h>
* u( }7 H; H9 Y#include <fcntl.h>
! V7 W! G1 H  i$ t#include <linux/kd.h>
) }1 a, N& z* n7 `) ?8 Q) @#include <linux/keyboard.h>
1 p5 o* [8 h: u# f$ t#include <termios.h>, L( n0 Q7 C; a3 t

2 k" o5 k) {6 A; A% H, K: d# {* G# ]" e1 y/ F3 ^, ?2 x& M
#define KEY_DOWN 0x100$ L" y2 i5 F. W' T
#define KEY_UP 0x0007 M( [8 a- }) @

) Y! |( c6 m' V( k) Uint oldmode;
% r# H$ x3 k5 r  S" _' x6 Y- T3 H: u- h2 l
struct termios new;
$ m+ m7 `% A, q& D5 b0 b' u5 Tstruct termios old;3 x& l' b& T( D3 Y# g6 T/ D

0 N3 D6 f3 z* R/ x7 P* rint get_key_input(void)8 G% U3 g6 U; K, \4 E
{" p5 ]+ F# W/ K* U" h+ y% g$ F! k
int keyboard;
" }0 `4 L2 u, P$ kint keyboardcode;1 ~1 l' \8 o, I0 L# ]$ h. Y# i
4 d" W, e& ^* u8 H' t
keyboard = init_keyboard();3 x& J0 f6 G3 X, ?: \6 i. g
do{9 X, A9 j" f8 ^3 B1 o
keyboardcode = poll_keyboard(keyboard); : D8 ^% p/ B! E& j: `2 R
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
6 H5 y8 P* E/ D: X% x0 M. c4 z: v( nkeyboardcode = keyboardcode & 0xFF;3 }' J7 t7 ^" y2 G( W" ~
//, q! f6 o! a; ^$ r) {$ ^
}. a8 b! w0 V( Y. o# q+ {
}while( keyboard != 0x58);
! Y3 ?3 p+ m$ z3 K. b3 sexit_keyboard(keyboard);
$ }2 K" M6 s& j8 Nreturn 0;# z0 X% |# h; u3 R* y) S5 g6 z
}
, A' z- B5 @, v/ E% U0 g: \! E7 ?8 a6 O4 S. [! ^  |3 ^
int exit_keyboard(int keyboard)7 @5 j: U6 {$ A$ m- e9 \/ B5 ~
{! Q" @, v6 t) k
ioctl(keyboard, KDSKBMODE, oldmode);
+ M6 F3 {  l8 O0 g' ^& {- Gtcsetattr( keyboard, 0, &old);
* ^# Z" y5 Q& Q  Eclose(keyboard);1 x: |4 m  n# U
return 0;
3 k9 e9 A5 i* j( Q0 ]% H, g}
; N! K7 n7 K5 N8 {8 Z3 Dint init_keyboard(void)
" g5 o% c& V4 E, S: |8 i" }{8 r  A$ r# Q5 w! K( R5 S
int keyboard;
5 i8 o% Q% z6 B( K
3 g4 H. H( ]# Z( B; p  Z3 skeyboard = open("/dev/tty", O_RDONLY);& N) d. p* k1 t. ~* c) @$ Q7 L
ioctl(keyboard, KDGKBMODE, &oldmode);3 I  K  X! @" O, A2 [: C8 W
tcgetattr( keyboard, &old);
! w/ }  _. p0 `* D6 Btcgetattr( keyboard, &new);% i- y% p) ~7 K
* U2 c* P8 x& S
new.c_lflag &= ~(ICANON | ECHO | ISIG); - _# R& e3 I, b% W
new.c_iflag = 0;
5 s  @  v( `- q5 A" Onew.c_cc[VMIN] = 0;$ V# W  U& a4 q; o+ r8 B& H
new.c_cc[VTIME] = 1;* g( _6 T5 `6 X, K& S: |

% v0 l* L5 F1 L1 {* K) X: {tcsetattr(keyboard, TCSAFLUSH, &new);
% f, k" Y% X4 d4 Z% @1 v1 |ioctl(keyboard, KDSKBMODE, K_RAW);
7 A+ L5 m1 T5 {4 a- C
- U$ \1 @5 G8 E+ d: [% ireturn keyboard;; f4 S7 N% }. }

: j# m3 }3 a# ~2 m0 ]1 W3 s3 [( ?( W}2 ], d& k3 e- @3 @+ Y- i2 R: m% L
2 _9 o& S$ r) J  t0 [* A8 U/ z6 a
int poll_keyboard(int keyboard) 5 ~. [& `" r& \5 L
{ # t4 a, ~/ a: K6 \
unsigned char buf[5];
! t* y7 E. H- r* h0 w9 d/ Wint n;
4 p4 E3 J1 c8 J' l+ U, n5 b* A/ |1 P& X; \* G5 D
int kc = 0;
0 Z1 u2 Y# c+ g+ ~( a5 G* vint i = 0;3 s$ m1 ], |+ n9 v8 l; ^; p
int s = 0;
$ M) {9 n" M8 Kn = read(keyboard, &buf, sizeof(buf));
6 g6 V2 l* P9 I3 t( C- Ewhile( i < n){
2 w, f& t: ^- \2 O: j/ q' a8 U  \/ M6 ]4 es = (buf & 0x80) ? 0:1;8 S% t  j+ U$ {9 x# c( G, H# T
s = s << 8;
9 K3 o+ ?8 w9 h! ?3 f' n, j& mif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
# ]3 H: U+ r4 `5 _- ~kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
, a3 q4 g# W$ {4 S7 Ti += 3;
$ o% g- M$ W& v4 Z}7 u9 X8 C1 c) K. [# f6 I' T
else{, i/ H! z( a# b  @
kc = buf & 0x7F;
' G0 ?5 k; v$ C# ]5 R& Si++;7 G! y' m: `% ]1 e  Q& f
}- W5 ]# H" b' M" X8 B
}" a+ }" L' |; I5 v7 ^3 \
kc = s | kc;
: P$ y; s) {* G' M+ T$ Qreturn kc; . s9 A. \" ~; L
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-5 00:16 , Processed in 0.028971 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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