找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19658|回复: 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。" f& ]' t6 d: m; o6 a4 a
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
. E# n- W( z* p2 z( r0 N以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。: b5 w! z" A8 ^8 f
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,- f" T1 R) e: {3 X" y( [8 N) p1 A
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
# c9 J) U6 Q( F! X& {& x另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
, U$ w. Z: ?( _- V5 w- C
' e/ t/ x. P( d. `. m    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。: S- Z/ A) j8 y& L8 y5 Q- _' g
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。7 Z+ q" N) r+ p- G7 {$ {

: y+ F1 R5 j9 K# Z0 a! d7 \* ~    请高手指点一下。
8 w+ I; [2 U$ x" ?% u$ x5 _! V# E8 |  P* L8 }
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> % H1 C* N: b3 Q# o
#include <string.h>
5 c2 L+ V. W( D4 Y1 f#include <errno.h> % @9 H, F1 V' L: x
#include <unistd.h>
* S4 g3 ?6 y' p6 Z6 N1 i5 o#include <fcntl.h>
& {& G2 K, G4 b  b6 [#include <linux/kd.h>' @1 v6 V" P9 u( O
#include <linux/keyboard.h>
1 I: P" Q( j1 V+ d#include <termios.h>- I5 a6 Y0 `" F" t2 P. r
9 C/ [( B0 K& B# F

7 G8 u  K, h/ j# ~* |#define KEY_DOWN 0x100
2 J/ e" o6 a& q0 o  P& m1 r( [#define KEY_UP 0x000
' ^) [# G5 |% l4 q2 c2 }  F6 K; R8 {
int oldmode;0 o' \% ~2 d0 P3 k; I

& ^/ O# N( x2 v1 X6 T+ fstruct termios new;
. b$ d5 K) t1 G6 v* }struct termios old;
4 ?/ y3 f; b0 y- `6 R
# c8 ?1 D/ z- \' k( M+ bint get_key_input(void)+ v8 @$ c3 T; c; h
{& y1 c4 y) z' f4 e
int keyboard;2 u" ^, _, Y) B6 p  t
int keyboardcode;
5 l" R4 i$ F) Z2 k8 O; d
- P+ z& H; l1 ^2 l& _; H) J# j, Rkeyboard = init_keyboard();
9 v* K. A$ G1 l9 Ydo{; |+ c3 j6 ?8 g
keyboardcode = poll_keyboard(keyboard); : m: m7 P) S& {9 O- v: J
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
: t9 G% _9 N, R6 [" ]3 Z1 Pkeyboardcode = keyboardcode & 0xFF;
( d$ b; \- n* \9 W# S//
7 f4 n7 i; m" H9 u; A}
6 }5 L7 \  [1 r' |1 b9 H& `}while( keyboard != 0x58); + F) \; j& A/ Z
exit_keyboard(keyboard);0 J/ N3 f- O( a- u
return 0;
6 ^* q: n- Y% T5 ?}. k! j3 T4 [& S7 D% N
+ }! j8 S+ |& u- u' M- n
int exit_keyboard(int keyboard): A9 @) A9 w( C8 f& ?1 s4 K
{
$ w9 ^$ E, D! `) R9 Uioctl(keyboard, KDSKBMODE, oldmode);
& b9 H7 Y8 T3 _5 b: O" dtcsetattr( keyboard, 0, &old);
+ u  k. w) z# Q7 x. Wclose(keyboard);
7 }  P9 d# D# x. G0 Creturn 0;
! D" g3 ]! u7 C" W' p9 Q}
8 P+ Z* {0 U0 j' _' Lint init_keyboard(void)
# R  E$ x$ H5 F5 |3 H( Z{7 a) H+ ?8 j( s% W9 O0 ^
int keyboard;
! m$ q  D* B" ^" k
3 J7 f9 @' Y  q, Q/ Dkeyboard = open("/dev/tty", O_RDONLY);
5 |/ m. \" s3 q; ~" Uioctl(keyboard, KDGKBMODE, &oldmode);
# l0 A7 s* f/ \* U3 n& ntcgetattr( keyboard, &old);
: Y8 w$ `. G; t, x, a  N4 B6 L) ctcgetattr( keyboard, &new);* Y) c: t0 {* j3 v

: b7 O) C! \$ }: X; w: w- ]new.c_lflag &= ~(ICANON | ECHO | ISIG);
1 J6 z4 @' C! {0 A. U9 M% [( dnew.c_iflag = 0;: u5 y0 h+ j7 ~9 _# ?
new.c_cc[VMIN] = 0;( ]/ N/ L( S1 @- x! c2 l' P- Y8 |4 z
new.c_cc[VTIME] = 1;2 T7 Z6 @0 p. n- M4 r1 X

, i9 d5 Y6 ~* S- ]; K' V' `tcsetattr(keyboard, TCSAFLUSH, &new);; @8 U" m6 K1 K2 c- o5 [: c
ioctl(keyboard, KDSKBMODE, K_RAW);
- T3 Y+ \. e+ l+ q; V+ @- z0 `, z# J5 E. G
return keyboard;
3 F$ t% M7 s! Z5 C' G& q
4 F7 O, {8 n: a* C7 E) @}
  g: R0 O/ J4 e* p9 e( D) b( _. h3 k& c: [' M. P
int poll_keyboard(int keyboard)
; i. t  d; U4 r0 r  E* b{
7 w% `0 {+ h* A- e  zunsigned char buf[5];
& Y* E9 u7 o) x( f: i) k% f( Zint n;* U* Z  G6 K/ P) _
) ~% ]4 O. X! D0 s) W$ T2 n( F& B
int kc = 0;( b8 _! G* f/ C+ {6 ?
int i = 0;% c# o3 i2 S( m" V  s+ w
int s = 0;
, y- x2 |' n7 bn = read(keyboard, &buf, sizeof(buf)); # Y+ I6 t9 \$ V% F$ |% r9 c* W
while( i < n){
2 s6 `" _7 z3 K& `- fs = (buf & 0x80) ? 0:1;
7 I' z) D6 Z' L8 ns = s << 8;( H- y( C# ]* u& \! Y
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
) d& j6 Y5 J1 E7 e" rkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);2 z# g  e$ N+ f5 f  B4 Q# W
i += 3;7 f1 ~4 Y5 v6 ^; p+ i+ r1 p0 v
}
) S1 N. q' L# U: F' ]: |else{
' q& Q8 I1 e& S/ S! Vkc = buf & 0x7F;
+ t# v3 m; M) O: b) i2 _7 pi++;
! C/ \+ _- E7 ^}
5 m) x. w  L6 d. F$ k}
4 H, @# V& p4 w, j- Qkc = s | kc;/ k$ b" d; ]1 k' Y9 l
return kc; # E: X5 D( I7 E5 C
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:37 , Processed in 0.100801 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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