找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19983|回复: 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。/ k3 H- v5 N* M# `: l1 v: k
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
1 ^& C. n  h3 u/ }4 z# `* i以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。- ?' a8 _+ ?5 L! K1 Y; g. a
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,/ l, ^! o4 P) j; }* p$ X% [
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,; O) \$ o& H( ^1 d! J
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
9 T8 m# `7 |" U6 x' R) I3 ]
+ [2 s& a" i/ w    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
- j5 Q; U& B4 N% f% d4 F    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
# D: j/ W8 t3 I: [4 D& M$ _  ?9 ~
3 S2 y2 V" V( C4 H    请高手指点一下。: f/ Z# D& X% @7 H! F
0 d/ z0 R. g# y( O& d- ~
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
% [3 e1 ?5 H$ Q  ~: u#include <string.h>
  W$ h. d* u$ M- A4 {6 @/ O#include <errno.h> , X  s& ~+ ^. e( L- Y
#include <unistd.h> 8 P5 L) S4 M# e% `- w3 k7 s
#include <fcntl.h> ' I2 z0 D! d) d/ H* u6 s0 U1 P
#include <linux/kd.h>! `+ N" D2 h. e+ Z2 S: C
#include <linux/keyboard.h>
3 S, s0 F8 q/ c1 I. M3 S#include <termios.h>6 n; M* }, U7 {- |
1 i* O7 e7 X( l1 T$ n
0 Q/ ?6 T- \' j$ S  _8 C* O
#define KEY_DOWN 0x100& H$ e6 a* n6 I$ A
#define KEY_UP 0x000. N) m  G+ ]( p3 q) I& r3 x
& F7 X7 V9 e4 p2 b& ^' M
int oldmode;
! |' M1 V* F$ B! v) g
8 n. O1 I3 E9 u/ ~3 m- C4 Vstruct termios new;
( m! g2 n5 J; a" U: f1 ~; @" gstruct termios old;; o  c7 c3 e; R" I& K# }; A# n( X% \

+ H. V; \; J( h+ Jint get_key_input(void)
: J: U8 K: x8 Q, c# M9 E' u{/ r5 Q! w4 D  Y. m+ L8 \7 T
int keyboard;  f) p. V1 R. V6 m; E4 p3 v
int keyboardcode;2 j$ ^& |; X$ f. J

1 Y8 _' b9 Q1 Pkeyboard = init_keyboard();
+ X( r. r; L9 ^$ H1 u$ edo{' {7 B' b( s4 N& K. n
keyboardcode = poll_keyboard(keyboard); 2 {, `- T1 F1 N! q* V% A
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 8 ^6 b/ g% O( q9 Y
keyboardcode = keyboardcode & 0xFF;
" {& {; {+ L9 G& |, Z//
3 U6 G- \/ O' Y- \! o2 T}
& j& h2 l" h0 m7 P. v9 V}while( keyboard != 0x58);
$ e, l* h0 ~+ j' o) sexit_keyboard(keyboard);
+ v) {$ ]" z- Ireturn 0;8 R& i0 h( w; o4 ^' z6 b! M, ~
}+ x" x7 u$ e" U' N" @
( G( Z- Q* o- P9 v
int exit_keyboard(int keyboard)
4 w4 U2 s. \4 ?& t8 [$ p{
) T$ r" u  p: z3 c7 |: [+ [ioctl(keyboard, KDSKBMODE, oldmode);
. k! y' p* E! v( mtcsetattr( keyboard, 0, &old);( R1 m2 {9 K9 g
close(keyboard);% v+ s, i" r  {6 X* h
return 0;1 p" I% w9 H2 _1 k
}7 Q8 h+ y9 {& x( `1 j$ }
int init_keyboard(void)
" C1 n; w9 X% B. W6 w{
8 o% y/ S5 }6 v0 n" w4 f! Gint keyboard;
8 N' Q+ M6 Y0 d9 T' }/ h' i* R9 j* g# N% [
keyboard = open("/dev/tty", O_RDONLY);
( V& O: Z# i/ I0 j- e) O$ y, M/ F/ wioctl(keyboard, KDGKBMODE, &oldmode);
: r, j# Q0 l4 p& `/ k3 }tcgetattr( keyboard, &old);
' {1 h1 _7 S, q1 G0 ~! P- j+ m% {tcgetattr( keyboard, &new);- `8 i3 a! v7 @
, ~- d- G6 ?+ m7 _5 h
new.c_lflag &= ~(ICANON | ECHO | ISIG); - k3 k: q5 f  l5 U
new.c_iflag = 0;
6 o0 |+ P+ A+ j. Znew.c_cc[VMIN] = 0;
5 `8 `. Q( L6 n& W" y* |new.c_cc[VTIME] = 1;
/ p4 M+ k- Z# q) v/ h6 [" Y/ A" W/ B+ h& c8 C# A/ L$ _2 @
tcsetattr(keyboard, TCSAFLUSH, &new);! x2 `5 b% F4 y8 [
ioctl(keyboard, KDSKBMODE, K_RAW);
5 o" b! f' X) Q* n. ~0 t
: z( [. f9 h, c# \: g+ J) Ereturn keyboard;" r: E; Z7 D, N$ K

( _2 B4 _; g( `- C# ~6 a- j}
, E: x" U) U1 ^' U2 S2 H2 @* G( q- w- b: E) o  O
int poll_keyboard(int keyboard) 4 h7 A+ ^4 Z; z/ b* ]2 p3 p7 W$ k
{   |3 X4 s% _4 K
unsigned char buf[5];
! {, m' f8 O/ F0 w8 s' qint n;
4 {* @& _+ \1 R' r/ o* a! [
! d% f+ j6 h) O+ cint kc = 0;
: k- N( d1 [/ M8 r% R1 |int i = 0;; a0 y0 A2 C; N- D
int s = 0;: i4 `7 ]: w4 J
n = read(keyboard, &buf, sizeof(buf)); ) F: W/ S% y% l4 W  `& }0 _* P
while( i < n){
) [0 |  B4 [4 G8 w& M( G, y# |s = (buf & 0x80) ? 0:1;9 X, _. R- [6 b9 d3 k3 R$ e
s = s << 8;6 I5 g# T9 Y" z% z* {- Z" X0 a
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
' p: E6 w5 |7 g: P  ~5 Ckc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);+ N& v+ L6 k1 g; h+ h* V
i += 3;
; ^6 G: A" R* l6 g}' |. J) M. }; z: v: p+ [- g: ^
else{
* I7 a  p8 S) f/ fkc = buf & 0x7F;
4 m3 Z- X( E/ l) Z) f- A2 l4 O" ?3 |i++;
- `. K; O7 O+ @: j}; [( M& q. Z/ N3 X
}0 [4 x4 v3 H. Y* }% {: w, D
kc = s | kc;4 j1 g( k* _" _* ~* K1 }
return kc;
* H" }: N2 I7 Z; b( f}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:51 , Processed in 0.435282 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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