找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20335|回复: 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。
9 w( \3 |1 c% i: `1 |" eKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
" z3 X0 [, T3 f以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。0 `* U8 X2 z) G( U% b3 {
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
: Q; ?4 v, `" K. C# S1 r  v" ?键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
' }7 j. W+ a- G" o另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。, z) o; \0 s- ]+ k* T' I
" w& d+ b. P+ u0 o' o
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。& ^3 ?  O  j$ \- A- L% V3 @( r6 i6 s
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
4 Y5 U1 v- ?' s3 `3 F, M* w; j9 K5 \- Q7 k* c8 U
    请高手指点一下。
6 D7 _$ e4 {! W3 [
, L: G# X" D6 {1 t" {8 S& ?# Z    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
6 t) T' b) Z1 ]# n6 r! {2 g#include <string.h>
& k& N+ J- C6 l* ]. Y  O#include <errno.h>
3 s; C5 b5 T) Z#include <unistd.h>
' e" w+ ?3 {  a) u% b; Z#include <fcntl.h> 1 R1 V3 ~6 V2 G( }; P* _( G
#include <linux/kd.h>
+ t5 ?$ L8 f7 m$ L# L2 i$ ]  M' r, f#include <linux/keyboard.h> " d# R! B1 ^$ R7 [: V0 e
#include <termios.h>
. b2 ~  w3 u! k( D9 W! ]+ o5 n5 |. @4 |  w3 D
( Z; b% q% m# B
#define KEY_DOWN 0x100
: p; _4 O$ @" J#define KEY_UP 0x0003 s. @/ o& W1 z+ g% W: R( I

+ N! Y; t5 N/ {* d& c8 aint oldmode;( Y% H. d) O& O$ [
/ ^  e) [- k. e& M6 s' ?
struct termios new;! z3 {/ Q7 B, B3 Z
struct termios old;+ P" c8 N, t0 @% X9 g/ Z
7 y0 Q* P' L4 ~8 J
int get_key_input(void)  u6 q$ i5 w% `6 g7 X9 u! Z
{$ |3 d3 E" I! j) A. S3 p) G
int keyboard;3 R0 e# w/ o, |* f4 _0 z! Y3 X' p  }
int keyboardcode;2 a0 p+ I2 J  T2 {0 G/ G
+ _. {* A  Z: k
keyboard = init_keyboard();
* n3 f* `, A, S' V. f$ [) Edo{% M. ?% G9 v+ n+ i
keyboardcode = poll_keyboard(keyboard);
6 D7 b& e0 ?: r' Y& K' P; fif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
5 Y  q! ?2 j$ U* Z4 S  L6 V, zkeyboardcode = keyboardcode & 0xFF;! a8 h& v, X$ u; e, Q( |5 }
//
$ ~+ h" M) }. d$ C}
. @+ U* [2 b: }9 x}while( keyboard != 0x58); 8 Y8 A& T. I& \3 y6 A9 W* a- ~* {
exit_keyboard(keyboard);
& g# Q6 Y3 t6 J3 {, areturn 0;
* f! n3 ?7 p+ z  z8 D2 O+ B}# u, G! Z% H! ~5 c

6 A1 T0 E+ o9 @' Y; C# aint exit_keyboard(int keyboard). V1 q* T7 C8 t; V, @9 y
{
, [) s- v4 J# zioctl(keyboard, KDSKBMODE, oldmode);
) j) L+ N9 H) Ctcsetattr( keyboard, 0, &old);3 y4 [! W( O+ m& \0 P2 i$ S
close(keyboard);  s  Q# [8 x# E2 c; O! y
return 0;
1 {% B9 F! F: \8 `7 B7 q& Q1 Q' {}
+ {4 F( d4 G) l) A9 o% oint init_keyboard(void): }. T2 N% X. `, G! @  T9 i2 Z
{
% R/ @9 Z& G3 A& `/ zint keyboard;
0 H$ Z0 L6 _0 D; r1 h3 l' V
6 ~. @8 A- K, k& `. ?. ykeyboard = open("/dev/tty", O_RDONLY);: w  `* X) j! {2 |) {7 Z+ S/ Q: m
ioctl(keyboard, KDGKBMODE, &oldmode);
8 a& i0 ]! l0 U/ x: L1 xtcgetattr( keyboard, &old);
5 W3 u& I& ~9 s/ w1 o7 M0 Otcgetattr( keyboard, &new);
. P+ I5 i7 X4 I9 K+ f" A& k1 r$ C2 f
new.c_lflag &= ~(ICANON | ECHO | ISIG);
" ]6 j" w, Z5 P" Onew.c_iflag = 0;  L; ?* I7 X+ X% T8 m
new.c_cc[VMIN] = 0;
) Y, h0 e/ E3 T9 lnew.c_cc[VTIME] = 1;
" Z& t- N8 D" D' c+ m& s' L- n
tcsetattr(keyboard, TCSAFLUSH, &new);4 c- }3 C' b" ^( P6 A9 g
ioctl(keyboard, KDSKBMODE, K_RAW);: X1 w+ R8 u  F7 G
- K" ^; P$ ~5 s% f% w: {
return keyboard;
/ g$ k, w) W/ u) Z$ ^% e3 M
0 \" ^" Q% |9 A7 @" P}+ |; X; Y1 ]. r5 v  N6 D

7 A$ R) c. `! K# ^- Vint poll_keyboard(int keyboard) ; T# C% k; ?* }% v1 {. r9 i
{
# b! r+ l( g! t% F, o5 h! G* wunsigned char buf[5];
4 W0 M4 [" p! T3 _1 l1 rint n;
8 e7 k- I1 u. W! @, {
% a& F# \7 Z% D5 z% nint kc = 0;# F! H9 ]/ ~3 ^$ t0 Z
int i = 0;
( F/ Y' W- w- \  C! [int s = 0;
6 u5 |7 |1 I9 ~' ~4 Z7 t3 A, xn = read(keyboard, &buf, sizeof(buf));
5 S" m1 \; w& v- r- \7 nwhile( i < n){' u% F- L# J: `1 m( {" v
s = (buf & 0x80) ? 0:1;
% t$ w; u$ X5 ]+ s% n, _  w% zs = s << 8;
$ [! b. x9 _4 d8 Z( r0 S2 Oif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){; e: s7 z/ d) [, t4 z6 {
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);% F5 u' \, V7 K$ v3 d! R
i += 3;% m5 r( n) W. J3 _+ ]: h
}
+ M& ^1 E' d) u) p; D! Q* telse{1 z; o! j2 S8 n4 C
kc = buf & 0x7F;# O/ d' Q: D$ D( u
i++;
* v, J- |3 R8 J' F}& F- o+ f* F# P. S# H
}
2 ^9 x9 i) }# e8 D# E6 akc = s | kc;
' M- H( X6 p6 v  r' V# S. \/ C0 }return kc;
6 c. G6 g) a, f6 g+ c4 U# \" \}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:08 , Processed in 2.110196 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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