找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19108|回复: 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。
% R; @: |+ I# t2 p. r6 WKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq8 v0 E' ?* o( t! N0 R  f( w
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
- }" s- g( m. M( Q1 h也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
2 k+ [- Y$ r4 y5 H: |键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,9 u& W5 K( Q# \9 k0 x
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
, v8 ^* J6 P$ U2 V  _. b8 f2 t) d* v+ \$ p6 `$ z+ n! D% A- U
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
" \; u0 H, Z4 N: c8 i/ r8 D, s0 S9 p    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
; r7 v# t5 S: J; O7 t
- w- n/ \; d7 x4 x$ {* Z# {6 X    请高手指点一下。
) {2 t  j" I4 }$ c
( u: F; W7 A7 _+ L6 C: J7 D( W    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 0 N0 o1 Y. c/ f: Z0 l7 o2 z1 g
#include <string.h> / f+ l0 W! R: r5 Z$ T& {
#include <errno.h>
- L3 C9 Y+ c6 |. r+ J" F#include <unistd.h>
. ]" i, f1 x+ E' g% c#include <fcntl.h>
6 `) j  D* ?6 [* X7 J#include <linux/kd.h>0 X: L& r4 R8 a  i$ ?
#include <linux/keyboard.h>
% F- L1 A, ^; U' G#include <termios.h>
) @" P7 q; @2 |- K5 z. y* X: S& b  Z2 X5 w3 a
& z- a& z# Q& G9 e+ o! ~" E  e
#define KEY_DOWN 0x100
' w, E$ n9 }, j#define KEY_UP 0x000
" j! ^, `! z8 S: w: W" [- k: J$ R/ E
int oldmode;, K% l3 y5 e: t2 i

& X4 B+ s5 N# K8 w2 v0 c3 |9 fstruct termios new;6 b6 }  |& G: [- u
struct termios old;
- o& ~$ x1 g* y3 ]# F# l: z5 }! J5 D8 r; v% U
int get_key_input(void)& |0 t* j' `- n' k
{
" b8 M, [6 h& Qint keyboard;
$ z1 O* x. W0 Z+ Wint keyboardcode;% n$ P5 Z2 d, i5 W+ _" u: n- M
* ?* c5 o2 d" E5 _9 p  p) Y
keyboard = init_keyboard();+ ?! }, |8 L; w, m- H+ y( \$ z4 [
do{
, b2 M) u3 f" }$ ukeyboardcode = poll_keyboard(keyboard);
4 z' a7 H( S2 v3 e( t5 xif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
% d/ L6 C' d7 I; r. w: |& ^5 Nkeyboardcode = keyboardcode & 0xFF;
" y7 W7 Y7 }; J0 a- ]. U$ n//- M: }  E$ }- O( q* J0 w
}! A, R1 k; ?- B. T+ o+ s# D$ H
}while( keyboard != 0x58);
* z! C$ W! ?8 O5 c7 {! K3 v* H# Oexit_keyboard(keyboard);% H: L0 e& q# l# D7 e5 T
return 0;
9 f  X7 S5 |9 G  {, A}2 h* {  c' G7 @/ l3 g0 [( l

& n! x! |# }% X8 Hint exit_keyboard(int keyboard), D1 e1 T7 K' t( [1 m- R
{
* }/ t. Z4 n! ~( _, aioctl(keyboard, KDSKBMODE, oldmode);! C" o$ v9 C( K) r/ O5 ~* |
tcsetattr( keyboard, 0, &old);
* \  Z9 r% m- c" u8 a  k( r/ pclose(keyboard);
: d! i# u6 ~3 m, K5 s, Greturn 0;1 J2 K2 _8 O- I* u' N( p( B
}
4 k6 L) `+ l  t5 A5 bint init_keyboard(void)
2 {$ n8 \5 U! d# t! Z7 B" [$ s  j{$ \6 x: R0 T$ y- R; N% ?
int keyboard;$ `; c- }! @0 [6 Y  ?

8 Y, D( ?  c0 K; Z7 c0 S2 ]keyboard = open("/dev/tty", O_RDONLY);
4 A) T0 Y1 X. B6 W3 V. cioctl(keyboard, KDGKBMODE, &oldmode);
, M( V  }! P4 O$ x) {* u) xtcgetattr( keyboard, &old);
$ g9 `# u  R: m  ]# Ntcgetattr( keyboard, &new);
  W3 k/ w" K. q7 O0 p
0 ]+ v+ V& c# N3 w* a* t5 `new.c_lflag &= ~(ICANON | ECHO | ISIG);
  }$ p8 a0 A/ e/ vnew.c_iflag = 0;* O! U5 N' f+ f/ c
new.c_cc[VMIN] = 0;
2 f% ^* H% F$ B4 F( E* S2 l: |( A4 Znew.c_cc[VTIME] = 1;
2 M1 Z+ i* V# \. s
& F, H. H0 C% Qtcsetattr(keyboard, TCSAFLUSH, &new);0 g( [  ?4 c$ w( n  `
ioctl(keyboard, KDSKBMODE, K_RAW);6 f  ^# O$ b; s- `% ?' Y# {

% o/ Y9 b4 @  p, creturn keyboard;
. G* ^# |$ _! v2 T+ ]8 v! R7 L& @- c: o. ^3 s# }
}  ?" W4 H$ Q# T2 _

: ~1 }' i- V/ z  l& O5 g+ aint poll_keyboard(int keyboard)
9 U) ]5 p4 @- q6 \8 U& X{   l5 t) ], R! J0 T  I8 S
unsigned char buf[5];
2 C2 G9 h4 P8 iint n;
( I' z% U& J' C  r' {
+ b  v9 e4 U8 g# D# Tint kc = 0;+ e' D& {4 z8 o+ U$ d
int i = 0;1 e! Y( H+ b" [* x: Z
int s = 0;3 |( e$ d% d$ t$ _! m& U
n = read(keyboard, &buf, sizeof(buf));
2 @' B: o3 n4 r. W- dwhile( i < n){( l* Y+ Q9 E. d2 j3 P' P
s = (buf & 0x80) ? 0:1;
. ^7 I7 H! B, e1 Gs = s << 8;6 [4 q; E  a  |8 U
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
3 U; G# A" A. i' k: pkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
; q1 v/ A3 o$ Hi += 3;; t6 _) ^5 A3 Z1 S2 n
}1 ~5 A/ X# l7 c" N& \( d
else{" u" E9 U% U* R' e
kc = buf & 0x7F;  `) y1 r+ d4 S3 X+ u& x
i++;5 s9 `( {3 t# \! ]7 d( F
}
$ z! q7 H! ]  b4 P2 T  S1 ?}
: y* u, k. h2 Zkc = s | kc;
" Z7 z' f% r: @' p- Qreturn kc; 7 [7 b& F" \! W
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:40 , Processed in 0.032864 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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