找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20443|回复: 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。2 v" `: Z) h; y! ~5 C$ n
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
3 Z8 W! j1 T, r7 I1 a' S7 v; D3 S以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。- {+ n# j4 i5 t; P& J. s
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,8 E. y, h8 Z! Y( k
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
& Z, o1 u9 m6 ?% d  _6 _& k+ C另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
0 A. d" K5 ~  M) W% {: o. [! T8 M# o$ r9 ^$ l' ]: y: ^1 D9 l
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。, @) s. g$ o' Q" z5 D1 f
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。  F; \0 D7 q% @: Y: |  v" g

( m4 w3 `8 f/ |) [* L4 U9 Y5 V, a    请高手指点一下。1 ~$ S/ {- x+ l  a9 k- i4 N

/ j. }7 f7 M! |    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 4 ?' k: t) A  @3 O
#include <string.h> ) P9 ?/ D2 @9 a; D& S
#include <errno.h> 6 T# m: D3 v- }2 T% X
#include <unistd.h> 3 J. d) |$ I4 I: u2 ?  r0 E
#include <fcntl.h>
8 b5 K; r6 s  R  B9 ^. a0 }7 a#include <linux/kd.h>2 \. b( \3 y/ v: w/ I
#include <linux/keyboard.h>
! w  N) w- B+ ]4 Z#include <termios.h>) c7 a" y4 u* U/ h
- ?% V/ C8 |7 u2 V1 \, Q2 D
9 C, J" I0 X( B  Q4 |7 O
#define KEY_DOWN 0x100+ @+ x0 w8 p0 R# D4 k  }) V& q
#define KEY_UP 0x0008 E) c+ {& R2 G6 a

' i' F0 ~$ a. E' Bint oldmode;) ~) n: e9 S" l  Q9 K, y
" Q# P1 o) T) H, \
struct termios new;6 u. F1 {+ n; k& |: E* X
struct termios old;
$ s8 N1 K4 k0 M( G3 o. R6 a4 g. V
3 ?9 a) \- Q* ]1 b% ]$ qint get_key_input(void)9 Y: Z7 |1 n' \) Z9 u' l* K2 C' D
{4 ?4 S. a; G  d- `
int keyboard;7 D# w- X) p) [3 Y  w6 r6 b
int keyboardcode;$ k4 r4 h" h$ S5 M" w
0 M# u; a9 j! J
keyboard = init_keyboard();1 s+ s1 I- n5 K! E: W/ D+ f6 ^
do{
# i6 }, ]' O' F# w2 S+ wkeyboardcode = poll_keyboard(keyboard);
& i" y2 d# n: K' H2 Eif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 9 O1 H: Q( R/ [( l5 ?& B
keyboardcode = keyboardcode & 0xFF;) ]7 [, X8 Q6 l. t+ v# a6 _
//
" l: i& Y( Q1 W0 I  _}
+ w& ~% F- J. m7 k9 r}while( keyboard != 0x58);
' K8 x8 Y9 n' j3 C& ]exit_keyboard(keyboard);2 S) f/ @. ~' Z( a) u  l- t( R! ]) y$ @
return 0;7 t2 |1 g, _" N, f# ^9 @5 z: f3 @. |
}+ I' b8 p- m' Q" C. `

- @: Q8 |6 U) C% ?/ }. rint exit_keyboard(int keyboard)) q1 g8 w7 {+ y$ S0 [: u* {+ D
{4 Y3 {& [: ^3 O1 P9 E
ioctl(keyboard, KDSKBMODE, oldmode);
4 p0 {; z5 V1 P4 p- a. Ftcsetattr( keyboard, 0, &old);
. R; S( M9 b- S) D2 Qclose(keyboard);
& n- }/ j& [4 e" nreturn 0;# W( i! o- N7 \+ s6 a6 o
}
' b; {) i: }1 Fint init_keyboard(void); |- L. \) n- ~
{! l6 d* C) _7 f( r" g9 P3 }# Y
int keyboard;
+ ~' @$ P" d* G2 h- Q* m- v' @4 w' ~5 u4 r' k
keyboard = open("/dev/tty", O_RDONLY);
/ v$ y  ~* ?0 mioctl(keyboard, KDGKBMODE, &oldmode);4 r8 V7 S2 V8 r& ]( a' J
tcgetattr( keyboard, &old);. x# x6 Y7 k8 `
tcgetattr( keyboard, &new);1 M5 \7 A* I4 a4 d* [

( L7 {, B, b5 T6 \- Onew.c_lflag &= ~(ICANON | ECHO | ISIG);
" K0 p5 W7 H5 P* unew.c_iflag = 0;1 L8 ^6 m/ Q) I* E7 i! D
new.c_cc[VMIN] = 0;2 |( o+ C8 n! v7 ?4 k1 A
new.c_cc[VTIME] = 1;
+ a# q. h2 r+ W1 k% U7 y# \6 L" S2 n0 T9 D9 ?; C2 T
tcsetattr(keyboard, TCSAFLUSH, &new);
! O* Y5 \2 L) n0 l  {ioctl(keyboard, KDSKBMODE, K_RAW);; v) S9 T8 c8 t: \# f, I* f" g
' H0 d5 e  }  Y8 Z
return keyboard;
- N: d5 Q3 g" r6 U8 E
% s7 B: U- ~& J7 m! }; u6 g. U& r}
! B6 x3 Q0 d' y+ k
0 p1 i  z9 P. Y# g4 ]0 Zint poll_keyboard(int keyboard)
1 W& V. R/ [. M' W3 x3 s5 ?: `( j{
0 w1 x1 v7 o, V5 }8 uunsigned char buf[5];  \# ~  Y) \. V; }& G
int n;1 i. T% G8 A, e+ j8 j# f

4 [  v; S6 S. @/ f; K3 bint kc = 0;
! p" F1 D( _3 i6 k0 Q9 h) c3 Nint i = 0;% f  {- ^0 L# ^' X
int s = 0;! _" Z/ K4 F' _: d
n = read(keyboard, &buf, sizeof(buf)); , H4 L! W9 c+ {
while( i < n){5 L2 T% j8 `  |& ^2 T
s = (buf & 0x80) ? 0:1;8 m, w4 G$ E+ K- I2 V
s = s << 8;
4 d* X" ^4 [& L0 Zif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
7 l4 ^) X& v& y. i- f& k/ kkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);' U, \7 G7 r3 |- o3 x
i += 3;/ I: ^4 {9 i/ K1 F5 t4 a+ ]( y2 [
}
# M5 m1 a( F- ]5 `- f  j0 @else{
  ?  i; N1 b7 e7 H$ }3 okc = buf & 0x7F;
$ J6 w7 x2 p/ u% M* Pi++;
4 d% C5 ?7 X5 x' ]( b4 r}4 p7 U  e" `& C. J2 |0 p
}' X5 X: |+ e& Z( K* k5 s
kc = s | kc;
% U1 ?( y' [" A8 Z! Qreturn kc;
, U8 @+ D/ S* D}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:12 , Processed in 0.067503 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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