找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19147|回复: 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。
8 Q0 i7 j# q2 L$ d  \Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq$ `( F% O7 C' O
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。# `1 I5 ^2 |6 C! B
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
, I! t/ d+ N/ k/ f; a键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,+ k$ S) S7 m$ Y( N* a
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
+ G8 ]6 M: [$ Y* c( p
( }2 }1 e3 }; ?7 y1 T) g1 I    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。7 S% u8 J0 d5 D: q% u. s! u
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。3 {2 D% ~+ L) b! ?1 s5 ]2 S! h

& h  z8 S. G; i9 k9 @) E" B2 ^    请高手指点一下。1 d, W6 x5 n+ l4 K8 k! ^& M

& h, M0 b! e/ g! V    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
1 ]( k8 z# N8 o. B* D6 g#include <string.h>
- p0 B0 P6 Z  h7 [& M/ i2 P. i#include <errno.h>
5 S( q: h  M- x. v9 R1 H& }- Z#include <unistd.h> 5 S: t/ ?2 ?) j! N1 }
#include <fcntl.h> . U$ a) L9 z* [, O2 I+ u
#include <linux/kd.h>
/ L3 _: N' S0 e8 y( B( \$ T6 `#include <linux/keyboard.h>
5 K& S& l4 q, F+ s0 d* M4 L6 h& q#include <termios.h>
0 x. I- A6 q" n' h8 O
7 t0 Y1 K! }7 N/ P* x1 a' l5 |; V( c, u7 f. C) b# C! R6 f
#define KEY_DOWN 0x100
# h. }, J3 o& c. q+ I#define KEY_UP 0x000
' L, y- q+ v/ H9 l( A2 A! U( L! X6 h% u1 P  l: i
int oldmode;  _# X6 B& x7 p3 E

) j) r! O, U' W2 t9 Z0 D3 Nstruct termios new;
, `2 j2 s& k" }( }4 Y7 W& i& dstruct termios old;8 m/ ^2 R" x' H: }1 }, i: h. M! p

0 u8 [# B( a! }8 Y4 B* Z0 d$ lint get_key_input(void)
$ Z* g! g: ~" v* G0 K7 m{% Y" x$ k8 i' b, a/ J# h
int keyboard;
8 k7 N0 Q) {2 L0 |4 G' m7 k7 ^int keyboardcode;7 N+ w/ l$ m/ z# F
. C- F9 O3 t: ^+ k7 Z8 \1 ~1 ]# J
keyboard = init_keyboard();+ x# G, L  ]. U' `# z) ]( J9 s  h+ f
do{
- @, G# U5 e. @) Q! Z, fkeyboardcode = poll_keyboard(keyboard);
9 W, S. L* i0 t2 Z. Y$ kif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ . h% R" `+ V4 P  g3 h# W, k
keyboardcode = keyboardcode & 0xFF;
( b. e4 D$ L( f//
: d2 }( |% C; z7 `  R, U  p1 D" x}
& g& j+ X% ^" P3 [% {0 T. c( Y}while( keyboard != 0x58);
" y# a) b  h, x" C/ Zexit_keyboard(keyboard);
0 U+ N" T! Y: I* ^/ A; Jreturn 0;
! W4 D( N* Y0 a( a- }! G, l; x" [$ I}0 |& b# l1 B& l2 }+ e* H3 v
6 W: W- d% h2 ~) o4 M
int exit_keyboard(int keyboard)
1 \, `" Z0 d) ~  ~7 M( b4 p' Z{! M& }4 T: d9 |8 `1 _3 o1 @* X, B
ioctl(keyboard, KDSKBMODE, oldmode);# X- q3 A0 O9 ^  [! i
tcsetattr( keyboard, 0, &old);4 b  Y( h, Q( @1 l0 R9 h
close(keyboard);+ C7 _- g" X5 z) e0 M
return 0;( L8 r# ~; L( U5 c# C. t* d
}2 ], L% t" S( {# K8 h2 ?6 D( b
int init_keyboard(void)
. S8 g, h/ r! q7 c+ e7 a, s, `& l{
( i* p& R3 q7 j4 |# x, d; Kint keyboard;
) a, d8 W! A, {4 L( U* H, s4 t
/ u. d; c. S& i3 u/ r* C; Dkeyboard = open("/dev/tty", O_RDONLY);
. }  ]9 ^4 w( r, lioctl(keyboard, KDGKBMODE, &oldmode);7 {/ a/ j3 D& d% {" k
tcgetattr( keyboard, &old);1 U6 r0 U  X9 S; [9 T4 F
tcgetattr( keyboard, &new);
) T6 E) C, y' B9 v" ~, n' U
+ X8 X/ }/ O1 m  Gnew.c_lflag &= ~(ICANON | ECHO | ISIG); " t7 ]2 c9 Z) H) w/ W  t# c$ U
new.c_iflag = 0;5 E8 _3 Z) ^/ a: H' U- I
new.c_cc[VMIN] = 0;# S0 u$ b+ v$ a! v3 Q; t
new.c_cc[VTIME] = 1;
6 U7 i. k% E# d2 B0 j" K
( y; |5 r" g* J; gtcsetattr(keyboard, TCSAFLUSH, &new);
4 M% ~6 G3 _% C& sioctl(keyboard, KDSKBMODE, K_RAW);
! M" k6 v4 s8 P1 F4 I# e6 g
7 \2 e6 M9 ]* T; ^return keyboard;
0 G0 y+ Z3 Z9 x4 m
1 l8 @- G5 ~. T" I6 r. |}
  k" R, L! V" t# d8 l: }6 p2 ^3 b2 A2 B6 ]) f
int poll_keyboard(int keyboard)
; m% @1 i) _% c. O) I% ~* y3 y9 w{ " k/ O5 |+ O' i: T
unsigned char buf[5];
! W3 _; l  N& qint n;0 J3 ^2 R( k" b* }' a/ E4 t
! _8 P9 n, L. T( N
int kc = 0;$ _8 v" ]. r5 F7 _; v
int i = 0;
8 ^. L6 ?3 U5 _( r4 J2 W9 }int s = 0;
) A9 ^2 R/ g  a5 Q5 mn = read(keyboard, &buf, sizeof(buf)); % h/ i' d# K$ u$ F* s7 h# b# {, d
while( i < n){
" P+ E5 p& Y. K+ Ps = (buf & 0x80) ? 0:1;  U0 C$ E* h; O* F+ O$ O
s = s << 8;% S6 E6 _- `9 E# o& q# N* H
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){8 U) u9 ~- D# o& d* S
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);) Z. n; A1 Y$ f9 |6 [+ d; m
i += 3;6 ^. K) }( N, T  I( E
}" A& _4 n2 c' ?4 W4 P- ?
else{
( E, ]. M; Q8 n8 J9 u$ \2 U) t: Ekc = buf & 0x7F;
5 T& I8 f8 f+ Yi++;1 U4 K4 [  D, F+ E4 V: X- M# p
}' Z" n& M2 r) i& w5 g  ?: H$ o
}
% ]8 \9 Y" X! x/ Ykc = s | kc;
  B1 c; ~4 P: G8 f; areturn kc;
1 h8 d. p( l# o  j& \}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 08:07 , Processed in 0.068818 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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