找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19275|回复: 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。! c4 ]$ J; i  O, V, A
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
+ O, Z, D# C. l以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。% d- q4 B. q* Z, P' t1 }
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,9 U- ]# A, W8 w( |; _  K8 i
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,* o/ T3 U, ?8 n: ^' [( B
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
. t, ], U) X8 P7 x& n* ]; e) R* E. @$ z# [$ ~% J2 T
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。& E, h* ^/ ~2 n$ J, G
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
8 p0 i2 C; _5 G- O1 C2 ?1 V  f4 N# D" f$ s' p8 N
    请高手指点一下。
( L! b4 X" G) U9 {7 x2 N( x9 s, Q# s- ]$ R4 Y  X4 q; B, v
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
- ^7 t& U9 n* E#include <string.h> , p9 w# n# y* g7 g9 V
#include <errno.h>
& q/ A  ^, n* V& i+ ~#include <unistd.h> $ \* U0 Y1 t" n0 n/ m1 Z
#include <fcntl.h> 0 [, f0 Q+ d7 x) X
#include <linux/kd.h>
8 T0 d( r! m3 d0 K$ W% ^( L#include <linux/keyboard.h>
3 X9 b3 g0 b% y+ [- H#include <termios.h>
5 }* d8 e$ C4 l3 c/ {# Q
% [& }3 n; l; z9 a/ a% d5 b# s) q9 a3 V# U! X0 \$ }
#define KEY_DOWN 0x100
1 T, }, S) L1 _! P( M#define KEY_UP 0x0002 ]5 S1 `+ I# D) o7 s) X

% z8 G: W/ M4 C: V, ?$ T% `7 F# Aint oldmode;
' A2 ]5 x$ B# t/ {: x. H$ _/ ~: I, S1 {0 e# d; Q6 \
struct termios new;9 T; @) f( y' B) N& u! f1 T
struct termios old;
$ j  n1 [3 T  I+ z) s3 g4 y, p4 H/ {; P& l9 V8 L* }
int get_key_input(void)
( V' w/ G9 l3 \{
+ N5 O' C/ {0 c  T, l! ?int keyboard;, ?' T2 w& P# j( t& Q
int keyboardcode;' H- z7 p& H- v# u

2 m# ~2 T) i3 @% z! Ekeyboard = init_keyboard();5 J3 L5 I4 e2 `( S/ I
do{, Z( D* ^7 ]" z$ o$ V
keyboardcode = poll_keyboard(keyboard);
! T% Y; @0 q' V5 sif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ ! P9 e, g0 R# B4 w8 c- [! H
keyboardcode = keyboardcode & 0xFF;9 F3 ?! e% u1 a; m! m4 `0 x; f
//
- A' v3 o  \4 I}- J- ]  k: o1 a5 j! A' i7 h1 I: i: X
}while( keyboard != 0x58);
0 B8 m$ ~5 n- t7 Gexit_keyboard(keyboard);
! v3 @2 A0 P: V' @- V0 ]return 0;
7 d6 i. h3 l$ L1 f}' G. c% T# k$ }( f7 H/ `( b
$ _1 N& i  k) ]2 }5 L, Y: D* [4 o
int exit_keyboard(int keyboard)& S: o# l7 m# ^) l# w1 D4 l% c
{9 S0 L& o. S2 M, ~+ @
ioctl(keyboard, KDSKBMODE, oldmode);4 y7 D; ~- ^9 n* [) U# r! q! C
tcsetattr( keyboard, 0, &old);
: T) X& V( G* q( Lclose(keyboard);
9 i; G/ ], ?! f( Creturn 0;
) Y' j; L8 b7 B6 {" g- n' [}" g) V2 D" R2 c2 r; p1 q! A# @4 Z
int init_keyboard(void)" z. y, R2 X1 q
{5 [3 X' {. k7 V' l* B: G. \' C
int keyboard;
8 `  I1 {0 K: I2 I3 D5 R6 P
1 D% g! i0 c8 A. C- E: p4 gkeyboard = open("/dev/tty", O_RDONLY);* `6 I. |0 ?" G% K
ioctl(keyboard, KDGKBMODE, &oldmode);, n2 a: Z5 M! p& `! N
tcgetattr( keyboard, &old);5 W& d% ^7 W" q) W9 V! s0 E7 Q2 r
tcgetattr( keyboard, &new);4 n! z* x& [$ [8 {. O. h( T3 H) h
% j$ [- h  q; ]' Z$ K
new.c_lflag &= ~(ICANON | ECHO | ISIG);
' {5 Q0 M* l: ~- K$ j% J& ~new.c_iflag = 0;
2 z6 v" {& u: e, Xnew.c_cc[VMIN] = 0;3 i/ t0 ?' S5 _* y* A4 Z
new.c_cc[VTIME] = 1;9 y; E8 J; _! n1 T5 L' O, e

( ]: _" l: Q: g0 q4 D& X- jtcsetattr(keyboard, TCSAFLUSH, &new);
5 K4 c. k0 R/ x& `" B1 Lioctl(keyboard, KDSKBMODE, K_RAW);' Z" z  \0 L0 b
9 ?8 M9 Z4 y. o9 m6 |
return keyboard;9 X4 n6 T4 m7 }; R9 [

" t! t3 q! F6 `" f6 ]5 i}7 g8 t0 f6 p% R/ b& L( c8 P

; e7 }4 l! Y# p" B1 mint poll_keyboard(int keyboard) , J3 |+ i: a; I+ r9 r0 g: h8 \
{
8 s: }8 M$ F+ S3 i& M# @( Gunsigned char buf[5];8 z3 t# {/ P# n# w* G* i
int n;
( B) M2 f) h0 P# x5 ?6 i& V6 R1 q
* {1 Q& _2 q$ u# v& b. p1 ^$ P6 qint kc = 0;
1 x7 ~) O! `- l: Pint i = 0;
" a0 O. `; [) D# @( b# q) ~) Z. V& L7 kint s = 0;: I9 p2 H" b: _; k5 V1 t
n = read(keyboard, &buf, sizeof(buf)); " a+ t: [! U0 r8 X
while( i < n){
$ o+ g! ^6 A% \8 d7 ls = (buf & 0x80) ? 0:1;
) x; H& C/ A8 w; l) R4 m* G6 Es = s << 8;9 E# F" x# x$ B: g- G1 n
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
7 c0 a# d- u7 h' X: k$ Rkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
6 a& ?# H  b3 n9 v- A: J& R3 Ni += 3;
; r4 O5 C! y1 j; N0 t3 F4 x}$ w6 C& P0 L/ L( t% _6 A* Y
else{* k0 @9 C) t1 D8 h2 g, p" R
kc = buf & 0x7F;! Z; H5 G+ E6 o6 y
i++;
9 I4 ]0 f6 S: s# q5 K  ~1 ^}
( O8 ^4 v; {& S! K& _6 ~3 x}  e+ W+ G7 r+ b
kc = s | kc;
% S2 }- i4 d6 B$ }5 h4 v5 ~% I6 m* @" Jreturn kc; 2 E: r, G4 \! o2 C' a4 E7 J
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 13:35 , Processed in 0.094863 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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