找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20262|回复: 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。
, |, I5 z" e, c) d6 J, }Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
6 e9 X) x3 J0 W' T+ r) ~以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
+ Z% V% ~. Z% M0 M! ~# H3 S也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,4 V1 m; T) [+ L6 X  B( i8 r( F
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
* k1 |# x9 `0 q5 z! k另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
+ q1 i4 l5 W: h! Q' k, }' b0 m
& e* z6 h* ]; u! S& x8 `    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。1 Y: F+ @9 S" v; ~  U/ P; ~9 j
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。! ^# k+ s$ X5 X/ f* F

2 b4 y9 O" ?! e4 b6 t+ h    请高手指点一下。/ T2 I/ {+ Q1 H" {
8 O# F  I4 g" }1 i& r5 s
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> : \8 W% D! F4 E4 x
#include <string.h>
$ M+ c. ]- Y8 o) u5 I2 [/ j#include <errno.h>
' C+ X' x* M) y#include <unistd.h>
$ Y. X" a+ H+ X$ o, Q#include <fcntl.h> * m' ]) A  c- t  K# |9 t
#include <linux/kd.h>
, r/ t( j" A0 `3 B$ Y& i#include <linux/keyboard.h> $ b/ u: z5 I7 G: {0 i- p3 N- j
#include <termios.h>
" s3 d9 {8 m7 U1 I$ a' K0 ^
% J' ?8 k) C3 |. |: J
3 y- _% z& l, z& a5 O2 \& E#define KEY_DOWN 0x100+ b& K. P9 t9 K
#define KEY_UP 0x000
$ G, T2 t$ ]0 a1 O6 V% f0 J4 A( e4 W
int oldmode;
  N+ F) v2 ?4 T8 h8 X! ?! u5 _- e# G+ ?% k: c
struct termios new;/ @2 A8 X& u! D. ^* R# M5 R  A( T! P
struct termios old;7 O7 B5 p, c; I) I* J: u( l% {. }
5 G" Y2 p( ?( @+ q) `
int get_key_input(void)$ P$ T3 X0 M( ?4 E
{
) W7 z+ S$ J& W2 ^7 jint keyboard;
. v. f5 @# ?  Jint keyboardcode;9 T& h9 V& B& F8 [8 b

& B) \# h& ^, t* y; o/ Jkeyboard = init_keyboard();
7 \0 _+ t7 c; P* Zdo{
: b% x- D" `) M0 n0 R& Fkeyboardcode = poll_keyboard(keyboard);
% Y2 j' x8 Z, Y! U$ H  G+ D& G/ A4 Hif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ ! s( p2 k4 ?3 u
keyboardcode = keyboardcode & 0xFF;8 z+ |$ o: U6 _% F5 c* C
//
- s9 r; h7 K  J# z; m2 j}
/ j  q  K  U# h: K8 R}while( keyboard != 0x58);
! d, h$ N9 \& ?exit_keyboard(keyboard);
: J8 c7 ~, t4 b2 [  s8 n" Areturn 0;. t1 }2 i" P( H! V& d- M
}
, o; f. H% r1 {" ~/ v; m+ M7 T" u5 s9 T8 C
int exit_keyboard(int keyboard)
4 ~# C6 B8 q# N" M9 T{- [$ T2 r' F2 t1 g- T
ioctl(keyboard, KDSKBMODE, oldmode);
$ O# g- E: V: Y' }8 Y+ ]6 H; h6 Ctcsetattr( keyboard, 0, &old);
4 |' U; B! x: U% |close(keyboard);
. O3 D/ i2 [" o; _% e3 A1 V% ereturn 0;
. F5 r; G) P9 _# ^1 D3 _! v/ K}
) f* y( c+ o  R+ eint init_keyboard(void)
! @3 n2 V# N' L{- `2 a3 Z! y" @1 s3 Z
int keyboard;4 {' ^+ C  z1 ^8 C0 N+ X

# F4 Z( P' l  \+ {, Ukeyboard = open("/dev/tty", O_RDONLY);& p1 n/ F; B& A
ioctl(keyboard, KDGKBMODE, &oldmode);3 q6 I1 }' ^7 h% E  s* P
tcgetattr( keyboard, &old);! I- C3 Y$ R9 y: z- {& s8 p( _* P( q
tcgetattr( keyboard, &new);
+ w' x7 {& {, J* x* {9 G! D- t+ n3 V9 o6 |; y" b
new.c_lflag &= ~(ICANON | ECHO | ISIG); & s: e- }6 H5 v- g6 L
new.c_iflag = 0;
9 E: ]0 t6 P, U7 K9 ^new.c_cc[VMIN] = 0;6 [/ o& i; h. z
new.c_cc[VTIME] = 1;
* d1 Q) ?  v& e5 C" U
) z- o) R) J  [$ g% mtcsetattr(keyboard, TCSAFLUSH, &new);+ _" U: K. W8 M
ioctl(keyboard, KDSKBMODE, K_RAW);
' p1 y$ p; i$ }1 n" f. p- O1 E, Q* u5 C* d' }3 U( B
return keyboard;' A9 y& i( A7 w5 v7 o7 Q

  u# N, j" O' f2 h}' q4 d3 t( t; d  x$ M/ V
8 `' `3 t5 J- k& e' Y
int poll_keyboard(int keyboard)
4 V0 {& H# ?. f* J/ g% D$ a{ 6 m; Z- F2 Y# L% g! D' o& a2 u
unsigned char buf[5];
' G6 f% e0 y; ?" lint n;
# D6 l  g( Z, j6 l6 c% x2 Q
, k( H3 N# K3 i3 \3 p' N# f. eint kc = 0;
+ D4 Z2 w/ k4 W$ S% \; k+ Vint i = 0;  P' W# h0 E$ o5 P# y0 }* m
int s = 0;+ C8 |' C! p- j
n = read(keyboard, &buf, sizeof(buf)); 7 s/ \4 @% Q0 s6 p2 Q1 h6 E. \8 O
while( i < n){2 z; G" f: b" R+ T
s = (buf & 0x80) ? 0:1;
, ]2 T' a0 v/ M& t$ rs = s << 8;) M, H$ @' _6 K8 J) ?0 h7 q( I
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){- I3 |+ T) n: J8 w3 B; x
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
1 ~# T0 Y! l, N* wi += 3;
8 ^5 f  P+ j7 u}
+ @( [( Z  l  B7 a; pelse{% v' C& a- e9 R) R7 a
kc = buf & 0x7F;& l  j# F& q# W$ u9 r- C
i++;
( d1 m+ I# i) O! F3 d* c: Z}
* t7 c5 ]- w, B/ U7 N}
: |  {! v' `9 ~- L! d0 {, Bkc = s | kc;
/ U. V2 j2 ~5 v$ \' @; k8 G1 ~return kc; % u( \% l7 _: k+ |* i. S9 F+ B
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 09:21 , Processed in 0.271508 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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