找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20301|回复: 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。" f' \& b( m  f4 }0 h
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
$ N4 T; |) _! E/ J9 `, J8 U! Y: ~以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。0 P& e4 y0 B. Q$ D
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
0 R; ]- L' B% x  ~$ W键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
0 x8 _- A1 _- w2 R5 h. Q: E另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
2 W( r  u, V: R/ ~4 e3 r3 |2 ^
8 v; ^! J0 P: H; `' `2 M( J. K( y    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。3 R- h& b- k0 T# F0 p! @+ L0 g
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
- `/ K- l- M' V6 @- w6 o) b8 _' D, c" `
    请高手指点一下。
" T# c  F- m4 ?- m8 ^; w  R9 V/ u  T7 e# \# G* d$ R5 L
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> % d/ ]8 [$ }! h: U9 @
#include <string.h> 3 F. q1 k* [9 K4 h$ y
#include <errno.h>
# \( n% r- @1 [; N' z* k, J1 K: b; |#include <unistd.h> ' U& v) }9 k9 @* e$ b4 Q
#include <fcntl.h>
. w9 P; L* i$ V+ K/ q0 X& O* Q#include <linux/kd.h>
/ e+ P+ {4 s4 B. F#include <linux/keyboard.h> / }5 E3 f3 e3 W* ^) n
#include <termios.h>2 e/ Y- p0 r+ f0 b, @

; l& V! e& U6 n! P/ p( U# [6 v% c1 X) g$ a- i
#define KEY_DOWN 0x100
1 X2 T* v( K+ \! {5 c#define KEY_UP 0x000
" i" m  ~6 K  C+ w" Y+ C, Q7 Q) `) a& ^
int oldmode;
) f5 D5 J& l  U/ ?
7 i0 ?6 u/ }  h" V  d* P5 C# K. qstruct termios new;
9 y4 {1 l! N! j# }& f% Mstruct termios old;
1 `1 n7 Z6 f1 ?. v' K, m. V% ~5 F8 A; F( {: ]6 o6 l
int get_key_input(void)
+ M6 M7 [2 s+ C% R( x' n{. q$ P, ~! j; q! d( u
int keyboard;
; K& A4 g+ W- u4 }. ^+ ^6 }+ ?int keyboardcode;
& h' ^! o# B+ b! c! W) D) ]/ ]( w2 q9 }3 S) }
keyboard = init_keyboard();* H# v7 E& B" T+ W% O) b
do{) L! Y7 J, A# @5 J9 z& {, k
keyboardcode = poll_keyboard(keyboard);
3 E5 m, o. D$ v2 w. aif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ - \5 V3 p8 y  _! d( T
keyboardcode = keyboardcode & 0xFF;% T( Y/ n0 \- O* ]& f8 _
//4 x5 L3 l/ n7 o6 Z( ]; ~4 C
}! f: e) B: v; U% L  @& X3 ^
}while( keyboard != 0x58); 4 Q* ^& k8 ^1 ]+ y/ i. t' n/ ?. _$ i8 ~
exit_keyboard(keyboard);1 |+ E0 X+ Q# V
return 0;+ ~9 P7 n" L. n* [+ o
}- s# B6 b+ R! h2 K
0 i7 Q2 \( P' C3 K+ l$ r
int exit_keyboard(int keyboard)- `6 ?, u2 i( _: ?
{! Q$ o: k: M( {! k0 T6 g# x' ?
ioctl(keyboard, KDSKBMODE, oldmode);. B5 e0 R8 G" O7 r' j
tcsetattr( keyboard, 0, &old);
6 e3 I  a  Z( Xclose(keyboard);* ?8 u+ v/ E: V# K3 K) a  O" k
return 0;; c8 C# I  f* T. V2 @) ]8 @
}
' U* ]4 z7 m- i- K  nint init_keyboard(void)
0 A$ ]# v, y% }{
& |+ l, T  O; w& `int keyboard;
7 s" b/ W1 p* r& E: w" b4 w+ o5 j: x
keyboard = open("/dev/tty", O_RDONLY);
4 P, A7 U* s! V8 S" tioctl(keyboard, KDGKBMODE, &oldmode);
5 Q' R4 |# @" K% Ptcgetattr( keyboard, &old);& D* e" E$ }; V( @) h0 n$ F
tcgetattr( keyboard, &new);$ }0 T5 n" _6 q" a: \
% \2 |) a% a1 J
new.c_lflag &= ~(ICANON | ECHO | ISIG); . u& J+ h6 H3 R; K( S/ K- T
new.c_iflag = 0;2 I8 @$ G% v) f9 P, n
new.c_cc[VMIN] = 0;
! z) D/ h9 D# \8 unew.c_cc[VTIME] = 1;0 p2 G$ l, R' u' y5 M, g$ [
# A" f/ K0 I( L
tcsetattr(keyboard, TCSAFLUSH, &new);
) f( c: {/ A2 ?1 R' Wioctl(keyboard, KDSKBMODE, K_RAW);
7 q. C4 j$ p4 k  ], v/ E& V8 e- G9 N) ~
return keyboard;6 r  u; m) h3 z) y( p% p4 `6 I
% }& H- z0 |: P. {  l& {/ I
}
; }7 Z( H& S6 s; f$ Q) B8 _7 L8 d+ G5 i
int poll_keyboard(int keyboard) - C7 A/ U8 i' Q8 Y7 Y( K) w7 @" B
{ ' ^2 T8 B& R, H
unsigned char buf[5];( o1 a, s7 W1 c1 s$ K2 n3 H
int n;' b* Z8 t& V5 J1 w! M2 [

. X8 p& W+ A/ J! ]. O) {int kc = 0;
( Y( K! D! v! s" F2 Wint i = 0;
7 O1 |5 |& L% N* U5 m3 f7 xint s = 0;
% E, ?! B% K  f# I2 q3 G' i4 S/ Y" `n = read(keyboard, &buf, sizeof(buf));
4 F9 O) n; p! R6 T% u! T  r2 I; [" bwhile( i < n){6 j# t1 C+ s6 J7 v1 f  V
s = (buf & 0x80) ? 0:1;( i' |+ M7 i2 Z/ q
s = s << 8;
- t! b- U% S) ~9 e0 n7 Hif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){+ n* O4 E! v. t2 q2 \" p
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
. q; }' F$ Q" d8 K! mi += 3;
4 L9 p# f5 N( r}8 p2 W) r; X* r& j- h- H$ N
else{+ G. N% @1 ?% `( q
kc = buf & 0x7F;
  j* t* r8 f& S# c8 ?  ui++;" S$ U. p$ B5 m( A, J8 n7 [
}2 n9 q& B3 j' y1 E
}; J5 B5 h6 M+ C. B
kc = s | kc;/ j& j9 D4 G4 L. p* u! l- Q% L
return kc;
! u+ z+ k7 L, N2 o}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-15 17:17 , Processed in 0.056240 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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