找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20074|回复: 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。* D* M; s5 Y: m8 U% m9 j* l/ X5 \
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq6 v3 C5 {# M1 B6 @+ ]( t/ K; J2 A
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
$ H- o7 \* M2 B& Z: G, b" V键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,0 R$ ~7 c, r1 h6 N9 f, @+ \
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
) C8 }5 N2 N/ n; e, s9 q$ x, N1 g) P9 \( E3 H4 T
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
( P4 n6 E+ v2 D+ e: D# t, m+ k    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
7 Z. j+ v0 g. X. n7 c: {. q4 T8 S& x4 Q
    请高手指点一下。6 V- \- y- D1 g) E' F

' [. x  _+ H2 h6 p2 u) d" s    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
, w2 e. z5 n% b& c! F5 t# L#include <string.h>
2 ~7 H& i5 a0 A. `#include <errno.h> 6 L: I7 v% ]4 o8 q7 C# E
#include <unistd.h>
. `; d' z. a5 c7 {5 G#include <fcntl.h> % W2 j8 I9 p( E) l
#include <linux/kd.h>( b: L' U# K+ d( r' L
#include <linux/keyboard.h>
2 u2 ~3 T! E( _/ L* j$ w#include <termios.h>
! i& l6 r. h7 \- v3 v. E/ G0 M% f: t

3 }. M  T, J% u5 K! g1 H: a( n& x#define KEY_DOWN 0x100& [  I) ~4 N5 `
#define KEY_UP 0x000
; {% ]2 c' J  N, l- a  c
1 k1 r- s* F2 E/ n5 ~int oldmode;0 B/ P) ?" d( e. D1 u' `3 r

% P& @0 c9 b: g2 D7 f+ ostruct termios new;
$ w; @; U7 E  S7 Q2 w/ x5 X; Q3 kstruct termios old;" L- r& o! x8 }& g

1 w1 t/ F" i: f0 p3 h4 fint get_key_input(void)
9 S; t# J, D& t4 S' u! f{8 j$ k- N+ `: e2 L% A
int keyboard;& i; ~. O' H) U& M% |
int keyboardcode;
" u8 }' Q- o2 V5 Q$ _* O
! }) B0 ]: x2 e8 N% L4 ]keyboard = init_keyboard();  g  S7 S! ~" X
do{
! f# T4 l( }- S( L. Mkeyboardcode = poll_keyboard(keyboard); , z7 C; J' i( _& T
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
! R) F( x% y1 I2 a# Xkeyboardcode = keyboardcode & 0xFF;# G' B* h2 e2 V' Z
//6 \( d  W' z1 t/ {, \4 Q8 b
}9 Z+ x4 W. F$ @3 w
}while( keyboard != 0x58);
+ t* B. o2 I  Gexit_keyboard(keyboard);
3 A6 }; G% ^$ z5 O  R. ~$ ireturn 0;
! R( {% ]" h! ~! k6 N9 J; C}
. y% H- h$ b& [) Q0 G& t6 \& S9 a/ v. i% U1 I; u; R
int exit_keyboard(int keyboard)$ e; B! @/ [3 Y: B
{
, \$ |/ h1 k4 [( m5 gioctl(keyboard, KDSKBMODE, oldmode);- n' ]' ]& N' }* h
tcsetattr( keyboard, 0, &old);
/ p, [4 I, T& d! nclose(keyboard);
, H, h9 Z+ O1 k# S% Oreturn 0;1 s! e+ k! }4 E1 G
}, ], k/ |* T2 P; l. n
int init_keyboard(void)" L6 h5 T" M5 p* [7 Y: `
{1 f$ n) t; _3 x* y$ L" c
int keyboard;, @5 Y* ?' `) S5 ?
* {6 E5 W; e1 u5 [# c! w
keyboard = open("/dev/tty", O_RDONLY);7 C4 @# A- |+ k- j, U
ioctl(keyboard, KDGKBMODE, &oldmode);
1 f/ B( W( \) b; I) @, ?tcgetattr( keyboard, &old);( k6 m) c1 U9 F, o! t
tcgetattr( keyboard, &new);
; ~: S7 a: y1 I1 ~" ^8 A& z3 T& M3 h' O8 f' K& l/ F% b* h1 N, T
new.c_lflag &= ~(ICANON | ECHO | ISIG);
4 E8 ?  p* \0 z" s" R0 Vnew.c_iflag = 0;  p5 |& {4 X1 q# s
new.c_cc[VMIN] = 0;: q, }+ i! G" V# K
new.c_cc[VTIME] = 1;  l$ p" ^0 [9 e0 C

4 N% a' t" r! L. p8 \: t# Stcsetattr(keyboard, TCSAFLUSH, &new);/ ^4 f3 e# p- E$ k. }
ioctl(keyboard, KDSKBMODE, K_RAW);
/ ]" S2 t  w+ k' K6 S  x1 g: A- c+ s0 O/ v: x6 K3 M
return keyboard;
4 u! h* F  `/ l& Y- _
) d) z( P- w  H. H}
9 Z5 H# q8 Z3 a, I! K, X  l% L* }+ \( \% U8 y
int poll_keyboard(int keyboard)
) s; H) d4 B0 c6 W7 W. a{
- [& f, K, ^$ L; x2 q, b7 }- H1 u% a+ tunsigned char buf[5];. l8 I) @8 l/ A- }5 v
int n;
, q8 w" d" E1 g
# C2 [( r5 Z( }$ [4 {int kc = 0;- e4 L( i9 A- S/ b
int i = 0;6 u$ V7 a8 ~% p. ?
int s = 0;
% {- m, v5 f7 e9 X! }8 A- {; R+ en = read(keyboard, &buf, sizeof(buf));
; z9 ~3 L$ n+ j3 Wwhile( i < n){+ h0 i& v& F0 V1 @
s = (buf & 0x80) ? 0:1;0 U# X, [; X$ J1 I" P: s- ~! l# K
s = s << 8;. g2 M/ X, O$ K2 _  T- [
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){, O# O2 c6 f: Z: p5 W6 `0 u
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
5 c4 \+ I" S4 S1 ]) v0 j$ ai += 3;9 U% x6 ]: p3 |& V" b/ u9 _: u
}
; T3 T8 Q7 k& Y; qelse{
! c2 N+ P  s2 s3 Gkc = buf & 0x7F;
- Z3 U( G( X* _0 l4 B" d0 bi++;5 k$ D1 s6 U' [& f  T4 N, ]
}# g' |9 B  a2 J5 N. v
}- N) N7 I7 a, |& s$ q- B6 k* m
kc = s | kc;7 Q& C# c* S' {9 }* A
return kc;
; {. B, I0 s% T& d4 L" E}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:02 , Processed in 0.070845 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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