找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18381|回复: 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。
( z2 _0 }) P8 d9 ~! ?9 F- [Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
6 ~4 ?* M. C, l4 C  g% B以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
$ F4 x  W7 k+ g/ k" |% U也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,( \+ {& C. a  q  ^
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

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

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
" m) I( u7 t5 E# x) j& u, m+ P, \* f8 X2 t3 r2 b
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
% k! J, A/ K0 T    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。' R" n) K# ?% c
; A  x2 ]4 z$ C
    请高手指点一下。9 m4 I4 v: |8 ~$ Z8 u5 {1 c: ^

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

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 9 Z& u* i! j# F3 q3 `/ Y# }! g' I
#include <string.h> 1 U$ k. C3 g* R% {7 M. _
#include <errno.h>
9 `0 J* e- l. D3 r* U7 H( U#include <unistd.h>
: F- p% z; r$ J* l) {#include <fcntl.h>
* a& `) M& j/ h: j#include <linux/kd.h>
$ }* z2 j9 M/ L3 D' c  @$ y#include <linux/keyboard.h>
, x5 t$ s2 _/ N& t#include <termios.h>
7 y4 R5 b4 S( B9 D  M) k
7 i, V7 {6 {. L% S0 [3 i
: \3 X$ T1 w* T. i$ j/ N#define KEY_DOWN 0x100
' u$ E; r9 {1 c4 q#define KEY_UP 0x000  v7 }) p+ ^# T& D" f- j
* ~& |) v* i. j. N: b' T$ l: I
int oldmode;
7 ?4 q/ t7 H/ f1 r4 _+ X# c7 [1 W
3 G  t- O7 N3 O7 istruct termios new;
. K9 N2 y0 H7 H. Vstruct termios old;
. F8 X) s* c; {
( r7 V, B' o3 i) ^& O/ Hint get_key_input(void)
. H8 I  D! A- K' }{
8 k  y" }2 i# S6 B6 J; X  rint keyboard;+ U6 {, A! X" K
int keyboardcode;1 j, U' |+ v/ O% Q0 y, `
7 x5 [3 G, y$ u: ^3 f2 c; I
keyboard = init_keyboard();8 ~: V! H$ g2 `
do{
. g6 [" h8 }5 L/ t! hkeyboardcode = poll_keyboard(keyboard);
; J1 D) z: A6 v. C; [) r' L. O! Y! dif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ , F  l  n  K% k3 P* o& P
keyboardcode = keyboardcode & 0xFF;- y/ w+ J9 V2 V- j
//6 I; C: V1 X! T; v2 s4 q! `
}
; s% S# L; J6 i- A5 N}while( keyboard != 0x58);
1 R4 V: Q1 l: z7 Y8 Eexit_keyboard(keyboard);: H8 O; d& T. h' \& Q
return 0;
) i9 ~7 N6 q) h! T# T}
. F7 s1 Q7 F: T; J, j& l) u
; H. A5 `8 j* X. ~2 t5 ~int exit_keyboard(int keyboard)5 w; e9 w! ~/ [
{
( X0 Y- C4 M% Kioctl(keyboard, KDSKBMODE, oldmode);
( E8 |1 P- }$ _tcsetattr( keyboard, 0, &old);% w. L: z2 e- r3 ]- g, w3 J9 |
close(keyboard);
# P7 L% j. a) l3 sreturn 0;
# q8 c5 j: t0 A: z4 b( ~4 M}- |' T" A. w$ g1 K8 [! D
int init_keyboard(void)
9 j% l" i$ @0 e{6 c" v1 I# I$ O+ z# H" j  \/ K
int keyboard;8 _9 V! j# O5 {+ ?. Z1 ^# C

6 ?! p3 V( M, @% M5 Y8 E+ D5 Kkeyboard = open("/dev/tty", O_RDONLY);
" {" D, y8 p& @0 nioctl(keyboard, KDGKBMODE, &oldmode);
0 z. V. G4 H- y  z$ c! Qtcgetattr( keyboard, &old);3 W* {6 z5 I9 V; D. M& @
tcgetattr( keyboard, &new);) p7 `5 i9 g: W
0 ~. Z  H( t: U0 L. `
new.c_lflag &= ~(ICANON | ECHO | ISIG);
9 y* F& X6 l1 V- Mnew.c_iflag = 0;
5 }4 a; J0 W+ y( Z  Anew.c_cc[VMIN] = 0;
8 }2 z; S8 T# j2 h( L- J9 o: onew.c_cc[VTIME] = 1;
2 i& k# y7 l/ Y1 p  P) Z  H: G" t, i. n9 D( T1 x" [5 p
tcsetattr(keyboard, TCSAFLUSH, &new);
% `4 C. }& t) W% U6 _7 l) eioctl(keyboard, KDSKBMODE, K_RAW);3 w  a% J, ~7 w3 ]) v

. m, C: b- V3 r7 T, S# E! t$ rreturn keyboard;
7 l! Z5 R! c# ?# g: @: x/ y8 U7 H) Y% W9 [/ x- O# N5 y; f3 ^% b
}
# q4 R" |( }5 m5 R/ r, {& p) o" \2 B+ P. v: \
int poll_keyboard(int keyboard)
3 O5 T5 ^6 V- h) w6 S0 H{ " v- l! g3 B6 [/ W1 R* M
unsigned char buf[5];
9 ^: m* l. z& k! [( ]7 f6 Aint n;
0 E; G2 w% m! L9 j2 P) {
  T+ w* a$ l( e' g1 {7 dint kc = 0;
, z, S3 ?% |1 K% U& d; O! L1 I& h) }int i = 0;- K) k% l% N" P& M3 y9 N
int s = 0;' P4 B) _1 |3 c+ c& R# g4 `
n = read(keyboard, &buf, sizeof(buf)); & R' _7 [& i, j4 r+ V
while( i < n){
' y  j; j5 Q( T1 _s = (buf & 0x80) ? 0:1;
8 ~/ ~5 ~# @  ^. w( @$ Fs = s << 8;% C! A/ y5 V1 b0 D+ j
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
& @  Q4 p1 h% N* u0 ]% s/ y- |2 }+ gkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);8 B0 h# C9 R: o1 B+ c8 B2 l
i += 3;8 Y! P" X( h6 h' S; f$ e; Z
}( J8 [: d7 P" a# d5 p5 V
else{
6 Q  I* o, C2 N- L) q6 jkc = buf & 0x7F;
+ c2 v5 g- c4 f) G  Xi++;* Q% c! r# F6 g" ~, H
}
; [* r( @' l6 v/ D- l9 k}+ T$ i% Q: r$ t0 ?9 j4 y4 H
kc = s | kc;* E# l* V6 S) ?9 C  B' U
return kc;
  }5 t. ~6 P) j! y: C: ?0 R}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 15:35 , Processed in 0.030788 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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