找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20061|回复: 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。1 C! W4 x% S# k) v4 o& y3 \/ y& g
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq+ w7 D2 {( b  h8 G
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,% A6 }6 h! A, i! Y  [+ a, |2 {
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
7 B8 N% }  A$ c) z% V* H另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。) H# i& `, C+ v8 z9 P

7 b& F0 N; h* W$ s* t6 d# D2 F4 W    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。2 e( k2 p! `4 G+ d) [9 @4 e
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。% \4 q5 T  n% o+ w# K, q5 Z8 N9 j9 I9 Q

8 N3 c! x( H. l    请高手指点一下。' b$ C6 f% M0 l. [
/ [; y$ d6 r' R3 y# M
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
1 D6 {- x3 y  M# O8 F#include <string.h>
/ [! p! }4 u( h( b+ Q0 }, y5 l#include <errno.h> ! A* {# g/ I( Q' z. i
#include <unistd.h>
3 e1 Q- T& y! ]4 q6 q0 k9 ^1 m#include <fcntl.h>
( L( r, N( U/ C$ [! N#include <linux/kd.h>
3 G, L/ n5 S" s#include <linux/keyboard.h> ! E4 U; f/ F# a' E. w- t+ ]
#include <termios.h>1 \, [* Y+ c6 C" X
7 S# v7 V7 k9 ]( S
3 {% z& e! j- ]( O/ c+ j
#define KEY_DOWN 0x100* x! A1 C" }2 s3 s  k% a2 K
#define KEY_UP 0x000
1 b6 y, ^- E) K
  P7 }8 ~" O2 xint oldmode;
: H" O, F! {+ ^7 f7 A' a/ S) s
# h$ y$ q: s; F6 X, [struct termios new;- X. ~- c3 z0 a& E& }
struct termios old;8 j8 a, j4 b1 a1 T( `

, N$ Q7 E- \/ O0 ?# |5 g  \int get_key_input(void)
$ f2 m- z: b: \% |1 D! c- v( Y{
  \4 E/ G" W; E- w0 |2 K3 M3 Qint keyboard;: H4 }; ?1 s" C0 e8 p6 p* G* u
int keyboardcode;
4 v; ^- c7 }, R- y% u# o; j4 m) K/ r# H/ L" D/ U; i. K
keyboard = init_keyboard();
0 m/ U: U. c+ A  q5 Ado{
! Y5 d. M3 j' \6 c- V3 V% gkeyboardcode = poll_keyboard(keyboard); 2 a8 Z( B2 w2 Q$ ]7 [; L
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
4 E  X) |, I( W/ Skeyboardcode = keyboardcode & 0xFF;
7 x/ B7 D) F3 l  J. K' K//" Q. T$ E& {* x
}  e" ]& Y# N7 N, h2 e) `7 p) a
}while( keyboard != 0x58);
1 y$ t# x8 j2 a% c* lexit_keyboard(keyboard);
  H! h/ h5 H& [+ e& Q9 g/ Sreturn 0;( {, D- M0 O3 x/ M$ l+ X
}( J7 s! D6 E9 U1 q
+ q* ?0 \" b% m8 d7 \
int exit_keyboard(int keyboard)9 \8 A. C4 e4 \
{. W* b) X6 w0 V7 [. d
ioctl(keyboard, KDSKBMODE, oldmode);
4 K# c# Y% Q' P. [* ztcsetattr( keyboard, 0, &old);8 p) e; i  T. f
close(keyboard);
$ Y7 P5 _+ Y, J% W1 w& |return 0;) c5 p7 _$ i2 ?
}" {3 D* l  }! l7 E( c
int init_keyboard(void)  X0 H. P# U. L! W% s, f- T; {
{
0 r, [( L! K* n: m/ w4 s8 e2 sint keyboard;- t" f* \3 \) g1 x0 x6 L3 L  C
4 H2 p' D/ y3 f3 m$ M5 y
keyboard = open("/dev/tty", O_RDONLY);' P. k$ h0 S" u( E& Y8 h$ _
ioctl(keyboard, KDGKBMODE, &oldmode);; B7 _. V3 i* [3 m4 o
tcgetattr( keyboard, &old);# V& g8 z$ ^3 x; T
tcgetattr( keyboard, &new);, B1 S5 d6 Y8 {- z( ]$ [

5 A5 H. i7 g5 O' {8 Unew.c_lflag &= ~(ICANON | ECHO | ISIG);
. g5 b) f/ `" H3 v2 znew.c_iflag = 0;( x  i8 p  [, w
new.c_cc[VMIN] = 0;
5 e5 t( N: N/ Q4 H7 I2 ?' O. J/ M2 Q8 ynew.c_cc[VTIME] = 1;; r( p; I- l. Y

6 \  y' W! \5 ?6 x' gtcsetattr(keyboard, TCSAFLUSH, &new);& s) O$ j( M  w6 [5 E& k
ioctl(keyboard, KDSKBMODE, K_RAW);; H7 A& S0 q# @% S% j- z; r# P9 ~* o

. i! ^& b! _7 o, _: J2 W2 Rreturn keyboard;
- q1 T2 J8 O/ `% K0 t9 S, A8 B6 Z% @/ X  m3 S( r
}- a8 q. o3 _9 {+ g
0 j; A/ w: o' D  y
int poll_keyboard(int keyboard) 7 Y3 U. f5 y3 z
{ 1 ?6 K7 ^/ N' m& o, S3 k
unsigned char buf[5];" |2 G8 o  q; X( ~9 r& e  f- V5 A% @
int n;$ W% C$ ~/ L& k2 J" X, U3 F  \

6 \* v: V2 T6 A4 ]int kc = 0;
3 ~/ N3 B' h7 T- I# {8 V) Xint i = 0;1 ?4 W$ B3 V: [8 c. r" h$ {" Z
int s = 0;
' A( D* V2 Y6 F" @% u0 {n = read(keyboard, &buf, sizeof(buf)); ' H* p. v3 P2 K, [8 V! Q4 H8 Q
while( i < n){
) a; G" U. n/ N! l3 v9 O/ F& `s = (buf & 0x80) ? 0:1;
8 D  t" Q2 ^! t+ u* K+ xs = s << 8;; \  m$ ?; z' k* @! ], q% `+ A
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){. o; w0 S3 w+ {' ~1 k! X
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);5 O% z1 p# A( D& P
i += 3;
/ c$ u% a9 @3 \; f+ X; K: J}
5 P; k! i2 C' ~+ ~% felse{2 H% x6 v' r" u6 L+ @# n7 ]
kc = buf & 0x7F;' ~" c2 K* B  F4 i2 L: M: n5 `
i++;
/ M9 u( w: }/ r0 V( _# [: T}
" w, d/ `4 _( q}7 B" ]" r; f  d2 Z; i
kc = s | kc;' S" d" @$ [- f" z
return kc; & K1 A- G3 {1 ]' w; u
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:20 , Processed in 0.117389 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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