找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20336|回复: 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。* T4 P$ N: v% ]. P, W$ [* m
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq' c' ~8 p9 V5 i0 W0 H
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
1 |0 i8 C0 @5 m) J也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,6 R& ^7 O  X  N
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
. @! d7 R2 v' d- e3 u. j另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。0 w+ D/ G) t  C" [5 E
7 P" z! [4 p+ {
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。/ ~5 B" s2 A! s
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
1 A  E3 a3 }7 B2 a( m- @  ^/ N% n, H# S2 y: a' M5 K
    请高手指点一下。
: t) D* U: ?' }1 `+ k, i' |
/ S' ]% q2 B* j, p9 y; U    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 6 d/ w0 `4 ]# y& }
#include <string.h>
6 u0 u: s+ T$ ?5 v8 B/ X& k0 [#include <errno.h> 4 z5 S1 [9 S4 J% j$ p; o
#include <unistd.h>
. {6 a2 `( q' ]' q3 Y#include <fcntl.h> 9 c  H+ e6 q3 Z/ J
#include <linux/kd.h>
; |+ B, v, {; T  A! W#include <linux/keyboard.h>   a  a# V& _9 P9 F
#include <termios.h>
: D; F9 A0 z8 T9 I& ]# N; f# w- n" v0 c/ S
/ q: P- \: [) j2 Z1 r6 v/ `( M
#define KEY_DOWN 0x100
: w( q7 j# i/ B#define KEY_UP 0x0009 ]: ?8 z6 M6 v* C7 _

% y7 Y# X/ a( p9 w$ @) d& Pint oldmode;2 T0 M  u* ^! g% q# q# h( i
; Z, T3 a4 n/ ^4 k% L
struct termios new;
' t* `! h! V% I6 Ystruct termios old;7 _8 @9 x5 S( R+ i- X
+ Q. N# n% p7 @- Q$ a3 }0 _
int get_key_input(void)
' e* s" Z( g/ R. p, U; f{5 [* s# z$ x& a( M! Y
int keyboard;
1 `" G" Y+ {& K$ U6 wint keyboardcode;
. ]8 Y4 o& n0 C- I, n9 J9 L9 b6 W. N/ y; D! h
keyboard = init_keyboard();
8 |' d2 s- y. z- C4 W: rdo{% O7 |# r' v. P5 c- m
keyboardcode = poll_keyboard(keyboard);
% F# T3 S: r# yif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ $ E7 Y5 m" k7 v; A
keyboardcode = keyboardcode & 0xFF;
3 [2 w. i. k7 [: U, L//8 B: D2 r% ?$ J0 x" q8 m  o& d7 g. f
}7 k/ k% w  Z1 Q4 Y& {4 _# m* T
}while( keyboard != 0x58); & z5 u* O/ Z2 L& `( }
exit_keyboard(keyboard);8 ~. F7 Y" a. x# S6 y+ t1 S# ^6 n+ L
return 0;$ |+ i. J8 e$ H
}
. Q( G' N; S& D$ f+ f! D; S! A" O" t1 w" D0 P* H
int exit_keyboard(int keyboard)
% L+ u! n" r, |{+ ?0 [4 X! t) B
ioctl(keyboard, KDSKBMODE, oldmode);, E  ?* W: E3 a% S
tcsetattr( keyboard, 0, &old);
: W3 U; e6 Q2 Oclose(keyboard);
! a0 p; M" U* D) kreturn 0;7 Y; Q1 x6 r+ {5 ?% H* A( \
}
4 f7 H& `( }+ }int init_keyboard(void)5 x7 \/ L9 x* B  u4 T" ?5 J  f
{7 r0 R) R4 n- `0 `  Y
int keyboard;! t' F0 t9 q2 ^5 Q6 r. y" D/ N/ L
5 @; y& Z7 _1 P8 r+ C4 Z; }/ L
keyboard = open("/dev/tty", O_RDONLY);
9 x  V% C: b7 G" rioctl(keyboard, KDGKBMODE, &oldmode);) N( O' I9 k+ J( B5 q% }
tcgetattr( keyboard, &old);
2 q; o5 e5 O, q- a* [. w* I. ftcgetattr( keyboard, &new);  D& S- b  {/ s

7 L- k, r  |+ r9 e2 Gnew.c_lflag &= ~(ICANON | ECHO | ISIG);
/ T$ {) V. K) w' Z* \# L/ Snew.c_iflag = 0;9 m9 s6 y) ?: T# c! \
new.c_cc[VMIN] = 0;0 S  J' L; J. A& H/ i7 l$ j- O- @0 u
new.c_cc[VTIME] = 1;+ j. S$ C' q9 x: @) A  P2 v
6 C, b% S, h! h8 A  C1 z
tcsetattr(keyboard, TCSAFLUSH, &new);
1 S* P5 ?8 n+ |ioctl(keyboard, KDSKBMODE, K_RAW);! }; L$ Y  E" T( K4 @8 ?' p3 F+ a( C
) D8 }! N& b# Y0 D9 o
return keyboard;3 b8 C3 N; z7 k2 j* M" E
( T1 m6 n6 g4 H! l$ J
}
6 ~9 ^; ~7 Y/ _4 N% ]2 V) ]
6 o4 g4 d* b/ [int poll_keyboard(int keyboard)
/ c5 V- u3 ?7 ]* }1 e{ ' _: h& {4 i7 ~7 r/ h$ Z) @
unsigned char buf[5];
; ^: y, H+ J8 W# Gint n;+ R6 g- i! Y" }: r- F

6 _/ ]7 E+ e- ^+ f1 q2 L; e" wint kc = 0;/ h5 i% i! Z0 j, L" K
int i = 0;# ~" W, f$ B8 e# j* ?$ h
int s = 0;
/ J) f) q4 o+ R( L( U+ o3 u5 kn = read(keyboard, &buf, sizeof(buf));   K7 z! O6 R& A5 n+ X) }9 I
while( i < n){, Y+ S: C* r+ R% P
s = (buf & 0x80) ? 0:1;
% }9 j1 C/ x' M' N9 ~s = s << 8;$ z/ L$ E, }& Q4 C, \' e
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
) u: |; y6 _5 b- J7 Wkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
' p& E9 k! u9 b3 ]i += 3;/ }( n# L; [1 Y4 s( ]* N! l
}
* b$ G7 S8 x  r$ e1 p& m% zelse{
/ R  {  R* h& Y* A* \. fkc = buf & 0x7F;- z" M& ?$ F8 }1 S5 ]" O7 G
i++;0 W) t2 j# P* y6 l: u' v
}
# O  B6 s8 }8 M/ Q3 z}# K3 _4 I1 p1 e
kc = s | kc;7 ]% o2 ^; a- s5 @% U9 [1 B$ z
return kc;
7 D! n/ K, {7 k8 n9 K: T5 P) Y}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:12 , Processed in 1.699444 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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