找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19657|回复: 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。
5 K" X+ O+ y/ M( U% Z3 f0 vKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
+ m. K1 j- p( i. Z  x) T/ u以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。! \5 x+ ~5 l2 d3 P* D& M
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
2 K6 P; K$ a' G9 Y+ C9 Z9 I键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

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

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。2 j5 \, ~; n2 j) i! P0 E( R) F; J' m
$ q0 e; T7 |# t9 T% E5 M5 q3 v1 f
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
. x' f5 \/ U, x' S) j    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
9 A8 Q9 k3 Y+ o# t& C1 J1 R( c9 w( H+ Y+ t* K$ o
    请高手指点一下。2 u0 W0 u7 V  _( z/ C$ _( U

4 {6 j0 ?5 w* O* [" C# q% J5 u    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 0 l. T" k2 i& @4 h" L
#include <string.h> " l: i! i' l" w: a. o
#include <errno.h> ; s' @" C4 Z6 K+ A0 s% n
#include <unistd.h> & }3 |+ X1 Y1 q# S6 W" U
#include <fcntl.h> 2 B: R0 W# \9 O
#include <linux/kd.h># d3 S9 P& a, ]' p
#include <linux/keyboard.h>
5 ]3 w* G2 e. E$ o' u+ D8 U/ i( O#include <termios.h>
, i# ~0 Z( W  x9 l4 g& M+ L# H4 H+ W+ u9 p( V
) I0 l' W4 p( }
#define KEY_DOWN 0x100* @0 }4 S6 X% q: d; x: A
#define KEY_UP 0x000- S, g! N: v/ y
* g+ ]8 j' m3 `7 B) C6 b2 b4 h/ M
int oldmode;
- S, S( J) `3 b/ a6 `* Q& \
" D3 T# a0 p" E7 o; Wstruct termios new;6 D' {/ H: T& |2 r# d
struct termios old;0 q* P6 C6 u. {  V4 I6 h

* ^0 Q+ L/ |4 x) ~: D9 Xint get_key_input(void)
* H4 f0 D: R& o0 o3 X{6 T( x$ H7 s. Y% a
int keyboard;- B) S/ v7 d6 v" N2 _' V
int keyboardcode;
8 \% A8 p6 x/ q4 \
' [4 b% s  O7 Q( lkeyboard = init_keyboard();) k* }: T+ ]0 f7 _% P3 W+ }/ Z' f
do{
4 d; D' {! O, ^/ ukeyboardcode = poll_keyboard(keyboard); 4 N: k" }% W8 \5 b
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 6 K6 M9 u4 x8 W0 ~  `
keyboardcode = keyboardcode & 0xFF;, R4 N! j. t, Q* Y# n1 q) n, [6 m
//
1 d7 X( Z( e- h$ ]% I7 y}
; I/ e5 S; D; K  k}while( keyboard != 0x58); ! n. ^5 Z$ g! c% [6 A
exit_keyboard(keyboard);: A1 a/ W' m# P+ X' v
return 0;
( J+ u0 b* v- P5 _* Q7 f8 A}
3 z% d+ V4 B( }+ ?; |, h; V, o5 [! [6 c7 R7 @5 @" O
int exit_keyboard(int keyboard)
8 W) {, z( l1 X* w' T0 d{/ g6 K$ |  Z8 o0 W  e* C+ w" t
ioctl(keyboard, KDSKBMODE, oldmode);8 e) P! W+ m: `" B8 ]
tcsetattr( keyboard, 0, &old);& j9 ]$ b- v' ]. Y& B* I, y" G
close(keyboard);
# o3 `+ q7 i: w  r/ zreturn 0;
- g9 C  v! P. K, k; e4 g}; ^/ C3 j# Q& D* C1 o- _* ~  p* J
int init_keyboard(void)3 D- J- M7 p& ^8 `
{
  Y3 j6 v4 v4 L& E- tint keyboard;
& B1 }( W2 A/ o, a4 q  C; ~1 M# `+ G6 E) V- l5 z9 c
keyboard = open("/dev/tty", O_RDONLY);
5 C/ E3 ?0 b0 K* a2 o: J5 ?ioctl(keyboard, KDGKBMODE, &oldmode);
  g* V! K5 |2 t' p. X/ j( C9 Wtcgetattr( keyboard, &old);/ T, c! N( @0 n8 ~8 s" J4 _* z7 u
tcgetattr( keyboard, &new);
' t/ Q7 o  X. W$ {: u2 J2 \; b0 _" I3 I  Y5 g& R1 I( [
new.c_lflag &= ~(ICANON | ECHO | ISIG);
8 N2 ~* o( Z& x( B8 J1 Tnew.c_iflag = 0;3 W4 m# ~) E+ s9 I
new.c_cc[VMIN] = 0;
5 \6 w/ O" \$ w( P. H( Z: j# ?new.c_cc[VTIME] = 1;' }2 `  n; Y; R" U# \

; n( v& d# X9 c- ^- Ktcsetattr(keyboard, TCSAFLUSH, &new);  ~) q# Q! I4 k4 m
ioctl(keyboard, KDSKBMODE, K_RAW);
, ?. Q- i2 @  i% h! {
7 \# ]  M; I7 @  q- o5 {* Freturn keyboard;
4 C/ |7 ]0 @5 d( Q
* b7 ?4 F9 h) v! B9 Q}
2 S* z' W' J6 ~! e7 ?$ c- `1 c2 k8 d8 ~
int poll_keyboard(int keyboard) / w* b) }; h$ C2 b5 \' c. m
{
+ Q3 |0 A8 p3 e0 L; B; x  sunsigned char buf[5];! \) {7 B0 N7 c1 @. I
int n;6 a5 j  X( H; N# o; A- e

8 y$ U2 m9 f) |' T; [: s8 Xint kc = 0;# l: R7 S/ Z8 O/ @' p# E/ M4 ~  p
int i = 0;
' d+ `$ U( e" m/ V  u2 yint s = 0;
# T% I5 c& r2 q8 p8 ]n = read(keyboard, &buf, sizeof(buf)); ' C2 p/ l7 o" X" H, E! a
while( i < n){: e% c+ q) `! `- e
s = (buf & 0x80) ? 0:1;
- [& C- w2 y% S& F, |0 Js = s << 8;
* M  S4 {' X# r/ M  \, mif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
# K5 ^7 [2 Z: M3 B; mkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);3 ^9 e% r, u5 D$ E- h) @
i += 3;
9 P2 @' H$ v9 t, E5 a}
, Z# {9 |' u6 ]9 J8 Xelse{
2 W/ D8 t* j; y' N* l3 ]$ g1 pkc = buf & 0x7F;' |$ H6 b& G* }- ]) m; l6 `/ R$ @
i++;( _; W1 h3 ], J
}
) r$ ?$ Q" N. P; I$ c6 n! L}! x6 B5 o5 T: ?% T
kc = s | kc;3 v) \& Z& `+ _8 j1 N* n4 w
return kc;
0 \1 m) k% t0 W2 Y* p0 h}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:11 , Processed in 0.354304 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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