找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19267|回复: 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。
1 F# Z# n! N' F3 ?' C8 l( KKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq* n. q0 d+ A8 a$ \3 r" d$ D
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。+ x$ T6 ?, y/ C" j3 L" k
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
& {( @, o2 {8 W/ c, Q% |键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
* w& G" x. o9 N( ?8 d6 u另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。) f; @# ]) {; o

* x( n- G7 I5 U- v3 r; y) R0 r7 T    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
) n- W4 k, {* w5 `+ G# D& s    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。, H  q. _- g0 K1 g1 p

5 p, E, n& a) ?2 b    请高手指点一下。
1 E+ @* E. ^3 X8 K* ?& ~, }8 @. r1 z# i* D% T
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
+ B( K2 e3 k$ t1 h; w- l  g#include <string.h>
: T1 A' u- E4 G% R" _2 C/ X% Y#include <errno.h> 6 R. C, q% Y+ y
#include <unistd.h>
& l/ f5 L% [1 _2 `- i$ L* X+ S#include <fcntl.h> ) B' ^% R# h; @+ k
#include <linux/kd.h>
: Y# ]! }' b0 I0 H" }* n  |" U0 |0 }#include <linux/keyboard.h> + U" Y: B1 s9 s7 ]0 V! n# A
#include <termios.h>! r+ X8 e, g& F5 g# Z

$ e% F5 U- r0 Y' ?* O8 i- f  Z5 C1 y6 m
#define KEY_DOWN 0x100
$ y- e4 U, v: X  i8 s$ e#define KEY_UP 0x0000 V4 b5 k9 U! \! h# @0 H2 D: f" H1 h" |

3 t# i+ d8 z4 ]1 l. eint oldmode;5 m6 b# c) _3 D! L( H

5 q0 o2 e' E+ f4 t, \struct termios new;
+ L8 i+ U9 u  `6 y; c* ]4 l# ]struct termios old;
: @! H6 \, I( V/ g, y4 V4 v% v6 c5 y9 K( T; e1 }7 T
int get_key_input(void)+ c1 G& X: j; d4 B
{+ x/ T8 _" {1 @$ [( c! i6 z; z" w$ S% m
int keyboard;* G  f. r/ }. h( J
int keyboardcode;4 H5 s' G- C5 C3 {

5 ^- P' e+ {: M# J/ z: b: tkeyboard = init_keyboard();8 c: z, \8 g, H! D( X1 K5 c
do{* V2 H7 Q# V% e9 _
keyboardcode = poll_keyboard(keyboard);
- l6 `6 Q1 d' {* v2 Z) oif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 0 H' D+ j, b4 B5 k* {6 K) ?
keyboardcode = keyboardcode & 0xFF;+ q/ C' b( r$ w3 n
//# p" C, C! C* J- A/ k
}0 f. ~7 H  T- ~% ^$ h9 \0 H5 L" l
}while( keyboard != 0x58);
6 K& o: m: R- s. d# ]: Y5 c" qexit_keyboard(keyboard);  H# R# B" {; G7 j8 L
return 0;
: ]* z. Q8 P( E5 n7 I# a: M1 H( T3 P4 u}
3 F/ w% d4 U* ~- \9 ~' Q* p3 Q4 d% H
int exit_keyboard(int keyboard)
2 N, c# E+ C1 ?: X{
# u8 Y1 [$ d4 J, ~, c4 x9 r7 E! sioctl(keyboard, KDSKBMODE, oldmode);
  H9 q! N$ A+ K( \tcsetattr( keyboard, 0, &old);5 l+ O. H% u$ C- v9 Q0 n) R; t
close(keyboard);
: p2 x; |, N  o% @return 0;0 w+ M' |- G2 f: ~5 }; n$ R
}
# Y& i; K( w0 @8 |6 `int init_keyboard(void)
& S) H6 Z' j; t* B- [3 [{
' D, P! D$ d& m# q* eint keyboard;* K7 o3 T9 R* u0 |5 s  \, s, c& L

- \  @9 f4 w6 \6 ?7 W3 {) V9 i7 {keyboard = open("/dev/tty", O_RDONLY);
8 r1 z8 F8 D4 A1 U, ]ioctl(keyboard, KDGKBMODE, &oldmode);7 C1 V, f! f2 U9 @3 T
tcgetattr( keyboard, &old);
4 p% y3 ]4 o) `4 Q0 j; ?9 d# \tcgetattr( keyboard, &new);
  h2 U+ Y5 q% K/ Q+ T6 S, E6 L
2 `  M/ y: r( U& l2 Z, a8 \: ~new.c_lflag &= ~(ICANON | ECHO | ISIG); 0 s  \: o% j+ j  y0 j
new.c_iflag = 0;- m& b( S# k& s, ?9 U" S, L
new.c_cc[VMIN] = 0;
( R; J( q  g1 g. h% r  hnew.c_cc[VTIME] = 1;
. S) z4 q( }# a! W; k0 s. _4 [2 B( f$ X2 G
tcsetattr(keyboard, TCSAFLUSH, &new);% K/ z: J, \! n) ?% j3 f, L
ioctl(keyboard, KDSKBMODE, K_RAW);
9 m* _* V: w1 ^! X. U7 X9 c% Q, X& _: Q2 X
return keyboard;! m* `) g% E$ P! o2 |

5 S- ^! T: _  S- i% r}
0 L" q+ r' t! y) Q, J" C+ ]6 M8 q: F0 S" ~
int poll_keyboard(int keyboard)
. f1 l1 D2 i  x{ 2 s. U3 {# u  W$ f/ M
unsigned char buf[5];, s  L5 S* {, ^+ u
int n;
' U( e) x% Q" \$ q5 |- D' X8 r; [1 h. `) c; f
int kc = 0;+ [+ e# h3 [+ \' ^9 m- l' x
int i = 0;1 F( @3 D# X( {# _
int s = 0;
5 o- X8 o* `8 s3 R1 u1 Pn = read(keyboard, &buf, sizeof(buf)); 7 c5 X/ G0 [/ v9 V
while( i < n){2 E' K& n2 S/ S; t. p! P
s = (buf & 0x80) ? 0:1;
& i; X4 f- D7 v$ q6 L/ ^s = s << 8;5 N( _3 q- U7 P
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
3 [3 R! ]: h1 R/ i& F4 e- mkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
7 N  J3 e6 ?5 L8 v) L$ S* ]% \: E2 ^i += 3;" B/ T9 v5 Q( A7 {' n! f
}
4 V9 ~# E; a* k7 T+ Uelse{% Y. ^3 V  {& r! F4 j
kc = buf & 0x7F;/ {7 _6 k( a1 ~; V) a
i++;
' h! V' }( C8 r  V7 |}
9 u. v5 Q- S' n( k- `9 v8 n}
$ u% s* X$ c, O5 H6 M) l& ykc = s | kc;8 `3 f/ x2 n: I. y# C
return kc; 0 C0 v4 A) J6 ^' L' l
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 21:30 , Processed in 0.026951 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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