找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19709|回复: 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。
: H: d* Z# v1 x# G% e5 b/ P$ FKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
0 P, X( D6 N4 Y+ c$ U* \0 ^3 h) N! U以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
9 D+ a! @* e0 `/ h1 C也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
2 [" u1 D7 k; D( {! s键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
6 J" y1 A5 e% U另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。/ `5 i' ]9 }! i7 g% Y0 K

* @/ T* h, N/ K2 Q% u+ a: m    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。. e: X$ `6 C0 D6 ^
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
$ M' p: S9 k5 _/ A- w. F7 N1 W. r8 Y+ A8 |- z
    请高手指点一下。$ ?. }* e# ~$ U* |. l6 b

- D4 c: _( v4 P, v    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
- i. W  J1 m9 f# v; z#include <string.h>
. N5 \  e4 M6 A5 A& ]0 q8 h- I#include <errno.h>
( j8 G  c" ^, z5 J: [#include <unistd.h>
; u( V& Y, _# x! g" c- W1 U#include <fcntl.h>
0 _6 i* ]* {8 m, W+ E8 F3 g  Z' R#include <linux/kd.h>
5 N7 M! R, k' r#include <linux/keyboard.h>
5 Q. S* z* G" F#include <termios.h>
* C6 I  k+ N0 U! ?8 J
5 u4 A* R/ D. W2 x) u4 K; N7 h+ d' a0 Y; O
#define KEY_DOWN 0x100
1 q/ f$ d/ o& t! {% y9 ^; `#define KEY_UP 0x000. A' w) g4 `2 H
7 S  j% P3 K, [8 M" e! g
int oldmode;
, {8 \8 Y8 H* O% r
' N- z6 P) t3 h9 ?% g$ Ystruct termios new;% E+ e5 K! U3 s8 n
struct termios old;5 k; h3 O" O) m$ w6 |/ J4 R7 X
3 R; C, m- o  Z3 n( q8 ^- ~
int get_key_input(void); ?( v( Y, P* F+ I! J
{3 k- ?4 r! n8 V
int keyboard;
# E# P) z8 g1 Y/ @; O# x& K! \: Wint keyboardcode;1 |3 Z/ h; X$ L: ]# P" v
3 T% a  C6 u  u
keyboard = init_keyboard();& B% O% ?# B7 q0 r9 `7 T
do{
4 f$ Y: B" g' V5 n1 [keyboardcode = poll_keyboard(keyboard);
9 J" c( `# ]0 aif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
7 {, W2 j2 i/ Y7 Fkeyboardcode = keyboardcode & 0xFF;# ]6 E8 f4 ^  ~' T" u' V% E
//  i, a2 `/ t7 n% @9 u' U# k
}/ A3 K" a, c6 T
}while( keyboard != 0x58);
- K  P/ S% a4 Dexit_keyboard(keyboard);4 f2 z" S/ }, V( V! Z( s! x
return 0;6 |5 o1 o% Y! ?6 e5 L1 c% W+ I
}
  Z8 _2 [8 }/ _/ j+ I
; E: }' m9 M* Z! H8 D2 @6 C" Hint exit_keyboard(int keyboard)
/ |, h( R2 Q! Q{/ f! ?% T3 T; [3 w9 e" h- h8 A
ioctl(keyboard, KDSKBMODE, oldmode);0 ~( d2 {4 T3 e" w& a+ h
tcsetattr( keyboard, 0, &old);- q$ y5 n  r# \( m- ]4 g  ]
close(keyboard);4 C1 L# K8 f: Y. |# @  n5 A
return 0;
# ?% c9 A% Q3 g5 V}" L  s+ p3 L. a
int init_keyboard(void)
& _: u: E/ k: l5 ~{* Z8 m2 o# P, n% M- n
int keyboard;! ^9 o" Z& E) c2 C1 r3 r9 w9 w
/ D& {* |  a( q2 n" s# L. @
keyboard = open("/dev/tty", O_RDONLY);) U( p2 X! m( H. g: h1 ~2 a
ioctl(keyboard, KDGKBMODE, &oldmode);
! _8 G( r5 J2 U+ m6 Gtcgetattr( keyboard, &old);  m% J1 |( n% e$ J! o
tcgetattr( keyboard, &new);2 t( Z3 K) ^0 f% `

* d$ v2 V: s/ l9 Knew.c_lflag &= ~(ICANON | ECHO | ISIG);
# G6 B# b5 o! P) Tnew.c_iflag = 0;
- W1 c/ z1 X2 ?: p6 @7 M4 t5 T1 D7 Rnew.c_cc[VMIN] = 0;
8 k7 j) N& l' T; R( A2 Wnew.c_cc[VTIME] = 1;
7 W& s) e+ K( `  [
5 C+ R% q, l. g& L5 O& ftcsetattr(keyboard, TCSAFLUSH, &new);( X2 ~) ]/ F* }% w% C
ioctl(keyboard, KDSKBMODE, K_RAW);8 ^8 V4 k: E* J0 t
) R( y/ p+ }" p# l5 u: G" B
return keyboard;6 \1 W7 d  e3 Q# V
3 @; }+ n5 I& n8 R5 a
}9 A9 u9 c8 l. [' b  |

* G2 z, w! y- p( {1 G& d' j4 K" yint poll_keyboard(int keyboard)
, N) A0 D# h& @{
; Y  K/ p# D3 W' w* Qunsigned char buf[5];
( n) C* D! ?# p: i4 E( u. ^  fint n;
* |5 N4 i( |$ z5 }
* ^& Y% d9 C, G3 s! i1 Qint kc = 0;3 _" o8 Y6 {& i/ D; g( g' l+ P5 N
int i = 0;
6 j7 G) o% P2 n1 b6 b. J8 hint s = 0;
5 w. l" N/ v8 j, U7 m) s- s* hn = read(keyboard, &buf, sizeof(buf));
4 i; U) t! |/ Iwhile( i < n){
, y! l! ~/ r; [1 q4 C6 cs = (buf & 0x80) ? 0:1;
2 n2 ^' I  M  i: V. Xs = s << 8;$ ^( p0 ]# o8 U  _, n
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
9 ~8 `* A2 l% ]# k2 Rkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
8 b$ y7 ]2 H6 ?7 C8 O- @i += 3;
- c% {! K4 k, {, k+ t$ p. f4 `}
9 C. Z" k# g; w* f* l' ]! d( Lelse{. X) t7 `5 T; u( E
kc = buf & 0x7F;
! k! V- l2 V+ |) o$ a7 ~* li++;
7 J1 f$ U, ]6 k% h}& [3 w: s& }) T: Q3 C& T+ x
}3 o, U- g8 T% R0 T9 R7 m
kc = s | kc;% S9 \# n' `; [  T9 _
return kc; , ^) P9 Q/ i' X) ]3 g) @  A9 i+ E
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 17:10 , Processed in 1.010243 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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