找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20327|回复: 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。
# ~/ P" I) d% s) b" M# PKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq# f. R0 Z, Q: C. v0 F
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。  J- K: b9 D; w+ Z1 N3 e& {$ g# ~
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,! P  t5 O7 F( J7 m' K
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
% M/ |$ e2 A; i另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。% _- p( a$ Y) l6 n* [& s7 |
- b) V) B+ s# a: g
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
( K* r$ U/ Y1 y5 l. E4 O    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
- }2 Z$ q" U$ Q6 ~3 G4 a6 W( w3 w& @8 n7 {+ c/ Z: [
    请高手指点一下。& l1 p8 p5 |* s% X  Z

+ G* A5 Q3 Q7 U5 I& Y    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 7 b' \7 j( I  N
#include <string.h> 9 G) S& @/ R  s, y3 @' Z4 x# H8 D
#include <errno.h> / Q+ v! z7 M; s3 m$ [' G
#include <unistd.h>
3 z0 y' V7 C0 X; O, l& t* C#include <fcntl.h> " Z$ t& f% F, {" ~2 I6 P! y. E0 V  A
#include <linux/kd.h>
& W  j( L# J8 A$ l4 K' @$ o1 t#include <linux/keyboard.h> 8 k$ r* b5 @) T1 w8 O: A4 ~+ r
#include <termios.h>
. @( }/ I- b4 d
' Y' P/ ^) _  U- h8 e* c
5 \3 c) i2 v. k* I' L  }#define KEY_DOWN 0x100
! \/ D) B/ Y, i8 p$ J# \) n; p, ]' M#define KEY_UP 0x000
5 ~8 P5 D1 N9 |& e0 A
2 n( T$ @) p8 M& c0 e, Zint oldmode;9 o+ }0 A4 N- S& \
7 n6 w) s. o9 d$ o/ W- S
struct termios new;6 J$ w9 b/ B/ m$ c0 P
struct termios old;" O8 C( u0 Y2 N1 {$ Y9 ~! G
7 @1 m' e4 |/ U( @6 y6 U% X+ k5 b
int get_key_input(void)- k1 \  x. _4 w7 r+ w7 ^9 s) w: Q, _
{
- t( \8 n# x: Pint keyboard;
7 q0 l1 ?7 Z# T! x  g% l" }int keyboardcode;, r( n- O9 Z$ O8 z/ P
9 P; K4 ~( p- K6 \/ b/ p
keyboard = init_keyboard();
! _2 n8 R" N2 q+ hdo{
# e7 C6 s( a2 |4 Z' r1 _4 N0 `keyboardcode = poll_keyboard(keyboard); ' D6 H: @. q7 @  k" A: e! O
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ " e( k- K' S. ^, d4 n
keyboardcode = keyboardcode & 0xFF;$ p; F2 ?9 M6 e: i- o9 W& H
//
' K% x7 L4 B) s/ h}
& q6 E) n3 p) Q% D}while( keyboard != 0x58); * ]' ~( N6 @6 ~5 D: a
exit_keyboard(keyboard);
" _2 I/ e, d8 k+ L6 L  H0 Wreturn 0;9 {) ~1 A; |( s' ~8 O& E8 |
}" x. }6 L8 I" z* F3 p

. W5 |' n$ s) c: F+ Y! [' k( g; nint exit_keyboard(int keyboard)
1 K. Y4 x6 z/ G2 C5 N3 t+ J{
7 u: b8 m2 {' g) A; W0 _ioctl(keyboard, KDSKBMODE, oldmode);
$ f; R' O2 u- htcsetattr( keyboard, 0, &old);
* n* P" D/ w; i. R" w" w( Gclose(keyboard);$ o& Z$ i0 \3 H1 c7 m' c
return 0;2 {% ]$ W1 _) }4 l( z- N
}
7 o* w9 `' o" ~. ?4 ]9 Uint init_keyboard(void)
4 L0 F/ n6 y" B4 I9 ~/ \6 |1 `{, q! _# g" L2 R6 w( z+ y8 f* C
int keyboard;( U% B# a9 f5 x

) T8 L* E: z6 X. w: Dkeyboard = open("/dev/tty", O_RDONLY);& B! [4 H8 _) Y6 r
ioctl(keyboard, KDGKBMODE, &oldmode);
2 p6 X$ n: V0 Jtcgetattr( keyboard, &old);
" [% a$ l+ _" l/ Ltcgetattr( keyboard, &new);
4 V$ h4 X/ \( V% a; G6 U( x7 i
) g5 Y, m; y6 T# B- J5 Lnew.c_lflag &= ~(ICANON | ECHO | ISIG);
1 I2 _% U0 S7 y; K- enew.c_iflag = 0;
: O, F, }, v! V2 nnew.c_cc[VMIN] = 0;
! ^0 X# d* v1 ]7 m2 v* C) ~- nnew.c_cc[VTIME] = 1;! i5 I( f! D3 x+ ~+ Q7 R% k, c

  V& G3 A- }# M$ y' J4 vtcsetattr(keyboard, TCSAFLUSH, &new);' p$ |- s' Z) m8 t8 g7 y
ioctl(keyboard, KDSKBMODE, K_RAW);
2 Y+ f/ `' R, G* {+ ]! C" `7 K2 v5 K) ]" o1 w
return keyboard;5 b( C! ~5 [$ ^
  ]( I, @0 k0 p. L) o( e
}
2 W& ?3 t8 ?; W* Y4 k2 k2 |) y5 `/ h9 u$ s$ S$ N" A
int poll_keyboard(int keyboard) 0 W( r& q, v- ~3 P: [! ]
{
8 M( d: H; V9 O+ Lunsigned char buf[5];0 u7 `1 j8 Y$ {  z
int n;3 h  }& l" L% Y0 \$ e" u

5 L% M# G' i+ ]: A, Yint kc = 0;
5 _3 f( ]4 O0 x+ c5 _. t1 Y0 mint i = 0;
6 U1 N; ?& D& _8 |( Kint s = 0;
8 K/ B2 h4 j! R  U$ Tn = read(keyboard, &buf, sizeof(buf)); - h& @7 e' Y7 ]$ m( e
while( i < n){' u$ |4 E% Q3 b3 Q
s = (buf & 0x80) ? 0:1;6 W- h! J5 _% t, P
s = s << 8;$ r# [" J2 H. W- N1 L
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){$ q+ B- _6 W2 M: ?
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
; B4 ^4 n( [' K. Q5 q" n" e- Vi += 3;
: O- v4 J% J2 }' N6 X; F6 y' |}8 r. ~, K8 e9 Z: t
else{
7 r$ i5 B- P8 @7 E9 q" ~kc = buf & 0x7F;
. K' `/ F6 m& n. @2 I6 L" D3 h+ Hi++;' Z* Z, i3 M5 V
}5 @% Q1 o% a) {  {  ~! [; h
}, c7 @- c8 M) @$ j; l& v6 y* _2 A
kc = s | kc;( z  W/ T; b# N
return kc; 5 Z( _0 X1 j* ~% b- u
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:10 , Processed in 4.213741 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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