找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18790|回复: 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。
! {% w! D0 T4 L9 g, \) g3 EKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
8 q" t/ q9 y6 s7 d- k3 i以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
0 \3 {2 H: e' `# h2 `也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
' Q) W7 ?. ~* H! l$ J键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
) \" X7 B6 a. \$ j2 S1 H6 y另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
" E) {2 h: s$ ?3 `3 B9 U. r# m# U" K6 r4 a& ?, V9 H9 P
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。8 O% t" m8 @; |4 B, p5 q. w
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
+ z3 l  k7 c1 n/ I+ b" ^% ^
# H7 `8 K! M" \8 C* E% d    请高手指点一下。
, j# ^) r6 r8 W
1 G! I( Z: m! g* P! ^    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> " j% n$ A9 P$ x4 r8 {
#include <string.h> . a( M+ a3 K+ D+ D) ^
#include <errno.h> - E3 J: `7 L; N
#include <unistd.h>
8 z4 i/ P. o' i- q+ W+ g) q2 S#include <fcntl.h> 7 t* d& S  C0 n! o5 y- ^
#include <linux/kd.h>7 O1 }/ g/ }: w8 w
#include <linux/keyboard.h> + b/ b8 m$ Y! `- s8 n$ o* S
#include <termios.h>
$ R$ n' j( \, @( w2 [3 ]" E' y$ ]% n# x$ T' o; Q; F% y  H
9 P, F9 X- T" E3 y. R  ^- O. q
#define KEY_DOWN 0x100
* w) i* s6 a) L#define KEY_UP 0x000& a1 ]6 |  f! s% y. P

2 [0 T# i3 Y/ w! z# Iint oldmode;4 N5 B! Z3 ^2 ]2 R# ^* d
4 v3 c/ n- x: T4 L  Y6 Y8 m! t. b
struct termios new;
8 n6 k3 V* {8 \5 K4 [9 S7 E8 k8 nstruct termios old;  j: t  q  c6 P
9 c% o* g- A- x- v/ Q
int get_key_input(void)
0 m. r7 P, F( v  d. D# J8 Y9 X" d{
) n0 Y6 K  H# k7 I; i1 j) e1 p6 ~3 l( K6 Uint keyboard;
- l1 Y. F) |; t8 j; Gint keyboardcode;9 W- j( w+ K. X
4 i2 y5 g" I/ E% O/ i4 c
keyboard = init_keyboard();
* s$ H9 Q# ^4 W% w' A9 vdo{0 `/ b) s& q0 @2 I/ o5 h9 J
keyboardcode = poll_keyboard(keyboard);
" G) L7 B% b3 |3 N& Dif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
8 C4 l) s( P4 a& B) r6 W9 zkeyboardcode = keyboardcode & 0xFF;
$ c. w2 D  `8 z+ R4 T//8 Y& D4 J% r, h' D( Z8 i8 F
}7 H' F; l1 d) H2 |' X1 M
}while( keyboard != 0x58);
" T3 [4 Q4 W3 S, `, u0 Lexit_keyboard(keyboard);
9 [2 x9 o8 k# C. U( Hreturn 0;
7 f8 T% g. h* C/ [}8 R, ^: u- L' `5 @; F% z1 o) W3 M

' `2 Z1 Y6 b( k9 zint exit_keyboard(int keyboard)
% O8 B3 f' `/ h' m{
7 C8 r$ f! p1 d2 qioctl(keyboard, KDSKBMODE, oldmode);7 r- n$ U0 b2 Q" y7 G8 z& V
tcsetattr( keyboard, 0, &old);7 X) j" j: G* C+ D
close(keyboard);
' ~( M4 ^( d: ]1 z: o2 V' Sreturn 0;6 W$ [1 _7 e9 p( D1 Q: [+ H6 N) l- j: J
}
) q  T& f" v* D1 P% U1 I+ D: [/ pint init_keyboard(void)) U) L5 L# g1 p3 C+ G; u0 n
{
% b8 D& P. k' v; _7 n4 g- Wint keyboard;
# V* Y$ G- G3 D9 m' v
9 x, c; F# g( i3 Tkeyboard = open("/dev/tty", O_RDONLY);9 c% G3 y; E; F2 h, o3 M
ioctl(keyboard, KDGKBMODE, &oldmode);6 }; b+ g, j2 w3 p1 M; _/ Q  L
tcgetattr( keyboard, &old);' A) N# L% T' T+ X. t
tcgetattr( keyboard, &new);
7 `6 ~6 n& m+ x: X0 A
) B0 r, x4 r3 S! Dnew.c_lflag &= ~(ICANON | ECHO | ISIG); 4 c3 J) R8 \8 t
new.c_iflag = 0;
, ~. [, t  L0 e* V  C* a  m; ?* cnew.c_cc[VMIN] = 0;
; Q7 U9 f3 d4 h" Hnew.c_cc[VTIME] = 1;1 S2 s+ ]2 r& u2 E
7 `) N8 z5 [, c* u
tcsetattr(keyboard, TCSAFLUSH, &new);
1 u# y2 L% `5 z7 Xioctl(keyboard, KDSKBMODE, K_RAW);) P# h: B5 P/ g  c, x
  ?; p8 v/ A/ K$ u  W
return keyboard;  D. ^1 T' n2 B

; g4 K* u' P, d}( a" P) B- m) r( t: f

/ f- s( O0 T" p8 Bint poll_keyboard(int keyboard)
, _1 K0 y% {/ g' J$ \0 d{ $ v3 y# l0 R8 \. ^; v! U. w1 N
unsigned char buf[5];
' _5 s1 [* b4 \  V  H; O+ }int n;
( Q$ v: N8 V1 i5 O0 J: M3 Y- Q6 i2 x. |" Q8 }( e1 O- D
int kc = 0;
. B/ m- k  t" W5 Iint i = 0;( D8 y9 ?$ c3 c7 t/ w# p( Z
int s = 0;
3 n( ]) f; t6 z; i6 g& W4 p7 i& @! Dn = read(keyboard, &buf, sizeof(buf));
6 p, F; Y% V# j, {while( i < n){  {$ |; e) y& `+ j
s = (buf & 0x80) ? 0:1;
6 K: m" @, q) j- xs = s << 8;
" h& z6 T7 z5 ~* W+ {. cif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
' ^) C3 x, [' v% ekc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);* O! o% d- t! f, Q" S
i += 3;
4 p! S: J6 L, l" l8 S4 r8 U' r$ B}% q) p. h, X  K) {6 G( _; Y6 s
else{8 e! Q# z% U$ q2 T8 V
kc = buf & 0x7F;
* D: d# o4 a7 O7 R% h) [i++;7 e3 o3 _, A) c; J5 g6 O1 `* Z
}3 j! v% _3 A! b: d8 b# b8 T
}
- _5 Y$ t4 p2 p' n8 B7 i# Ekc = s | kc;& |0 i) K. c  c  m/ J* g
return kc; 0 V/ B! ~9 t: Q
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 00:48 , Processed in 0.028951 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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