找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20076|回复: 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。* d2 X: s  o' ~& E
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq2 r( Q' m) B# S3 n. }1 |/ _
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。8 p/ n6 l% _( d( D1 V
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,: G% t+ B8 m2 W
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,7 W4 r: U+ |+ d, Y! s+ r/ @% I6 m
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。6 F) y% c- M0 ^8 B

: l. ^/ U9 t% Y9 T    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。5 I9 M0 u7 G3 t
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
# u( l9 s5 b4 a; ?5 f7 s3 {% P/ @+ Y* i, L) q( o3 \
    请高手指点一下。0 j. y2 s1 J: R- }" L
, u$ k: U" i9 M8 k" y
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
0 O2 P- m, a( H' U, m4 T#include <string.h> # d1 R& q' n: `( v" k
#include <errno.h> 0 I- H& ^# K# y# W5 \
#include <unistd.h> ! B, {+ ?/ P7 G& E* T
#include <fcntl.h> " j& k1 M. W1 B$ S; b9 [4 M; T
#include <linux/kd.h># l; a- [. V* L! l5 a1 `) [
#include <linux/keyboard.h>
, n$ J0 h8 C0 K3 h! v7 n#include <termios.h>
7 O( Y. p8 M) c" n1 G: [! J0 f* X' w) @$ x

  ^0 ?) R# `2 A' ^/ z#define KEY_DOWN 0x1005 q# s) z# n# o$ D, b8 V3 E2 C
#define KEY_UP 0x000
4 i5 t$ s, r3 U9 v6 U, V$ W1 W* l- ?6 q
int oldmode;8 _& @* T0 X7 t* u0 P; d+ @0 Q
2 Z) A' W9 j5 d$ ^4 m; G" T. c: ]
struct termios new;6 D' @9 ]6 r( o
struct termios old;! L* J* R3 {6 m8 `. K
. W) V/ ~+ g2 a- u3 T2 A; k; p
int get_key_input(void)
% _2 z4 b+ E9 d9 i{  [: X% p& M, n9 O3 H4 m2 Y' T2 L
int keyboard;
% d+ F) O2 O7 o# @7 q# R! z/ r- rint keyboardcode;
  C, {  Z- @: V( J- l( p; w8 E$ U- q# N6 V
keyboard = init_keyboard();
+ _1 X( F% ^. N( Cdo{
3 C" u5 C# f' L; Okeyboardcode = poll_keyboard(keyboard);
% Z" y7 A5 m0 t+ c/ kif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 5 c1 v4 S# r6 Z+ Y% T
keyboardcode = keyboardcode & 0xFF;7 w- G  e: g, T' ?( r; n# ]. s
//$ f) w3 c. \0 Y9 t1 C9 I
}* c3 M: x# ]. _/ I# S6 D- m
}while( keyboard != 0x58);
4 E" L% r: `, q9 e+ s4 m! texit_keyboard(keyboard);
4 s; a. q( d" W( f* C3 freturn 0;
; T) \% H8 o  T+ N1 t4 v! V6 S}
% W' k. s/ x" T3 m9 }1 \5 W5 ^
* K. @. g% }  f$ i- Tint exit_keyboard(int keyboard). \8 A0 p9 o& M8 I. h  P, Q
{
+ |: v3 b2 \( S1 A* z6 r* n- Bioctl(keyboard, KDSKBMODE, oldmode);0 G3 L+ _5 v& H" t& U9 `
tcsetattr( keyboard, 0, &old);. q+ Z% J7 q! ^& {4 m" D
close(keyboard);" x- j- e" H9 D" v/ R+ I$ u* a
return 0;$ ~% r8 l& O) ?  l
}) P9 E$ U+ T% w; p
int init_keyboard(void)
8 L+ [4 H" K9 b{
3 L! h5 @# r8 L: z* Rint keyboard;
  G1 e- M" A* t# |$ |+ N7 d0 P9 D/ j0 @3 [0 V  l
keyboard = open("/dev/tty", O_RDONLY);0 x' c* S* [# z1 c
ioctl(keyboard, KDGKBMODE, &oldmode);9 Z. \! B7 o6 O* M2 i7 j
tcgetattr( keyboard, &old);. x  q# x6 _# s$ F( u
tcgetattr( keyboard, &new);
( P1 K4 u3 b* o* }7 ~% [. t$ H4 n2 {( K) P
new.c_lflag &= ~(ICANON | ECHO | ISIG); 2 a- J/ B( y  r- ?
new.c_iflag = 0;9 N0 R( L% K" r' T0 i& `' [  T' j
new.c_cc[VMIN] = 0;8 r% z% D6 P7 p7 F+ Q* ]( Z3 i+ `
new.c_cc[VTIME] = 1;3 [0 p6 ~+ f- q1 Z
6 Q* ~$ t+ V# `$ J) Z7 J- G9 Y* K5 `
tcsetattr(keyboard, TCSAFLUSH, &new);
( F! [8 G. a0 x' T* F1 w5 a) D* Bioctl(keyboard, KDSKBMODE, K_RAW);
& S/ U5 x! R$ X9 d% q( c- C% {' g/ s  P& T- X; R
return keyboard;& ?6 u6 S' \' b1 m
* A0 k4 o3 o" r, e  p6 n
}
2 x& s, Z; ^: B' C; N0 t  w- p& k
int poll_keyboard(int keyboard)
  J* v, \+ w: ^7 U' l{
1 S& q2 k1 |4 T' |  d* |unsigned char buf[5];
5 F6 K  H  o1 n: }( E5 T5 Eint n;
8 n+ `2 ]$ ?6 z" k% a! ~# C- L
" c) p8 R% G( Y5 O5 jint kc = 0;
4 K) C% k! c4 h" g! Y& Dint i = 0;
& ~9 d9 s, b* }4 Z  n; X0 Mint s = 0;0 e: T9 Q; h5 X! W5 c% o7 q
n = read(keyboard, &buf, sizeof(buf));
+ c" {" e0 w8 B  r$ E  owhile( i < n){
2 q) L" e9 Q; Z2 P% _8 cs = (buf & 0x80) ? 0:1;6 U7 D% s9 e) a
s = s << 8;
: H( f. K5 r0 o+ }, r% }) _4 yif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
: ?5 j9 \* n* e: d$ P1 H  i1 Zkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);; U' T, W4 O6 y
i += 3;
! U# n1 Z; C/ g8 O! {0 O}$ A" w; k" U% a/ G
else{
9 A. z# q. M& c, ]; Y+ ikc = buf & 0x7F;: A: t* v" V4 O/ O% h
i++;
) o( R4 K( T% c8 A+ |' o}. }9 g. a5 M! J0 ^2 r
}
6 k& Y5 T! H) T  P! xkc = s | kc;  j7 @, F7 S: l$ S
return kc;
- y/ R  D# j5 v' u}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 18:01 , Processed in 0.084697 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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