找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19955|回复: 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。* F/ O* j2 M% ^; n! S
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq4 y+ j8 y- Y+ {1 g& F' O
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
, z$ Z$ p& U& u" L键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,  F3 G) p1 z. I" T1 S
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
7 Q1 C( B' q( Z- y2 O/ G. i
" H, t" X- k0 L2 {8 z    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
. r1 z9 A& W" A, V, w$ I    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
5 T' }/ y: {% p: \. [) N  `1 |# d4 e- e0 b
    请高手指点一下。% F! W, S9 q- z# R$ ?

4 v8 q$ |; G, \. i6 c6 }    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 1 ?. T2 B( Q, h6 q9 l# l- {# E
#include <string.h>
! y+ V3 w1 Y' j9 k: E1 M* h7 N% L#include <errno.h> 8 g0 n4 e) h3 y
#include <unistd.h>
5 o. g  b0 k. a  j( S6 Y- t#include <fcntl.h>
% L1 [- x$ }0 a8 S#include <linux/kd.h>
8 P) P2 Q' R$ K5 y% g0 k& X#include <linux/keyboard.h>
) \) m3 S( t# ]; O- A4 V#include <termios.h>
% C  K- Y6 {" M- K8 B" y! C4 M+ Z$ s0 F8 t5 x/ `

, V9 S( M5 Z$ u#define KEY_DOWN 0x1006 J9 A  M; G2 U/ R  k
#define KEY_UP 0x0008 c' e0 y! j- b# z$ Z; _' i
3 F% @# L- X6 P; Y7 R
int oldmode;
# S) a) q' X3 ?- O, b* r' p
/ j( I9 _3 z$ ~6 |' ]struct termios new;/ J, ~  M7 H  ]5 m' E
struct termios old;
$ F. P3 t4 V+ `' S2 u; Z, R& W! x5 k3 l3 h
8 N% d* n% n! g6 \8 W% Iint get_key_input(void). V% A5 h$ x. [2 l9 @- w
{
# U, `5 Z" x9 Y* Yint keyboard;2 p0 s8 r4 P+ g2 M1 Y1 T
int keyboardcode;
8 ]" @( e! _3 S/ G1 r% v( l8 m0 z& @* \" Q1 G0 h" \
keyboard = init_keyboard();
5 d. w9 ]$ m" ~: E) A! Xdo{
1 @8 u7 [& y, F( c) ckeyboardcode = poll_keyboard(keyboard); 9 j+ `( y* L. R+ m  k+ s
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
: G) D! x( V: \! |keyboardcode = keyboardcode & 0xFF;
% R( f9 f- z2 u% |# _/ G! G//
- n. {2 x9 M  X7 Y* e}
8 e5 x6 `# s6 ~: H8 [2 i8 i}while( keyboard != 0x58);
+ C" E' G! V5 N, j! texit_keyboard(keyboard);& h4 |. Z/ T  l: X
return 0;
. Q) F/ _* {0 v1 r$ F1 `) s' n}! K* _% U' m. r: k# g3 Q' m

  G! S0 o, C+ hint exit_keyboard(int keyboard)
% y: j0 @4 X+ Z) ]  j{
2 v; W9 Z5 S& Fioctl(keyboard, KDSKBMODE, oldmode);- k% }& q/ \5 v" k: D. y( ]3 A
tcsetattr( keyboard, 0, &old);
/ y: d. O; x& K0 W; S, v% o9 Lclose(keyboard);
2 S6 t- _- t3 ]/ Ireturn 0;. m* ]( C' V. d6 k0 T! c
}
1 D, M) M6 P' K; k8 _4 Jint init_keyboard(void)
4 f3 A, V0 u, Z; J{  ?: O9 V+ e5 M) I1 M' o
int keyboard;
8 y1 r+ r5 x' X7 T& e/ m. I
( {+ I* Z; I' `7 h0 t- @) bkeyboard = open("/dev/tty", O_RDONLY);
" q# g3 \2 u# q/ [0 _8 [$ cioctl(keyboard, KDGKBMODE, &oldmode);
6 R9 f( o$ f6 U1 S% }tcgetattr( keyboard, &old);9 ?/ n( S% K1 q
tcgetattr( keyboard, &new);
' ]4 Z5 a+ `1 o4 N9 y- d% y- t4 \2 [2 ]0 b4 b) t
new.c_lflag &= ~(ICANON | ECHO | ISIG);
& ^- r( t' K# G" j8 t5 Unew.c_iflag = 0;
. W3 D: {: \# onew.c_cc[VMIN] = 0;. |  k5 u( a7 Q& f/ R- S+ P3 `8 a
new.c_cc[VTIME] = 1;
% K0 Y4 f  [. n! [1 Y$ e* B( {3 p" o) r4 V$ W. X1 B
tcsetattr(keyboard, TCSAFLUSH, &new);
" D0 E) q: [  d* `ioctl(keyboard, KDSKBMODE, K_RAW);7 V2 I2 @+ N' B: z: X* Q$ Q2 m
2 |' i) `' v' H4 U2 M
return keyboard;3 e6 y. u9 N( f4 R' r$ q
7 c3 `% ?( D7 ]3 z! }
}+ t, }; k. S; Y- d% e

9 Y3 j7 m# F: O/ V$ Jint poll_keyboard(int keyboard)
9 _' p3 ?' G6 W; J& @6 E! |{ + t, Q/ F( @: ]( y5 W+ S+ K' Q
unsigned char buf[5];' @! s8 b4 e' {1 e( B
int n;3 V7 P0 }  i8 z; t0 Z

. j0 R; h* t4 L" s$ P% Uint kc = 0;3 l7 H7 {, \. B/ F' _& `. q4 Y$ ^
int i = 0;. q* v  C- H4 M8 @+ m
int s = 0;$ H' @) {- i- w% V5 t0 S
n = read(keyboard, &buf, sizeof(buf)); 7 ~6 L% h$ e5 a, h
while( i < n){
) K5 z% k' B+ b+ @; Ms = (buf & 0x80) ? 0:1;/ I4 P# ~0 x- q- f2 J: q! Q
s = s << 8;( l7 L; x: [7 j. T: q1 m. W
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
) `, Y- T6 P/ m, O* lkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
4 u# ^7 D' S4 s0 |" ?7 M, L2 vi += 3;
; p; s% t8 k, v" {3 O5 g8 L+ l% ~  {8 X}1 }$ x$ X! y8 b4 O4 V8 _" I. E8 I
else{
2 m3 o$ }7 ]. x1 xkc = buf & 0x7F;! Q* I% M! Y0 e! f5 @3 o/ J8 }; l
i++;
6 T5 F/ M# o. B" I}! J+ B9 C, b$ Z, {% r5 k
}- x$ a) D/ B- f) D
kc = s | kc;
$ @: h- v7 ~; z; o. Hreturn kc;
( p/ f8 G- ]+ ~+ L1 M}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:56 , Processed in 0.076201 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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