找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20062|回复: 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。
6 V( ?8 @9 x9 L' u7 N, T+ L+ sKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
% C3 e1 V& j( n" U* [以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
  V. j- U( E/ j' Z- q$ Q+ `也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
5 f* U' ]' J+ m/ K% W3 G# n键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
) B! y8 T/ z' @. V另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。- i& _8 a6 N& ^% e' w  Z* f

2 M0 n7 M( u8 A4 y; I& h3 I    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。( X$ y9 z$ r! C0 q! F5 f/ s, u
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
& y+ y2 J5 o# ~; Y
4 p- n$ J, {. L# \7 y    请高手指点一下。
3 Z3 k- U& R9 x% T
1 C# f( I0 w# }/ s' O    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
# {9 V* _; l$ X6 {. X8 e#include <string.h> & ^0 h7 Z) b4 R7 K5 z+ e1 _
#include <errno.h> $ A3 n* B( z1 u5 M  I2 K& c1 x
#include <unistd.h> / ]. W1 m  B& S" a3 h4 m* B& s
#include <fcntl.h>
, i+ z8 x' S" d: j4 `" h& a#include <linux/kd.h>
) I- u/ G& d4 K( g* x#include <linux/keyboard.h>
; t3 z; o6 Z/ y) D; d! J#include <termios.h>
  K/ S; a% s' M/ @0 ]
( F0 [. d0 {8 U6 t8 ^- A% \4 a0 }& J$ c9 @
#define KEY_DOWN 0x100
: |1 q& m) K& f" |#define KEY_UP 0x000
9 N# N3 e* Z7 S% a5 s9 h, c0 X  ^$ J7 |- q* ?0 ]" t1 K6 u5 ?, L
int oldmode;
# o  N8 e! _0 _+ U" z" t6 e1 O, V- L
# J7 |' y( X3 j7 z+ l! S- n9 dstruct termios new;1 g: s6 t: h9 N! e+ ?3 @
struct termios old;3 c- Y" [$ ^6 \# \+ Y5 g
5 E% P7 w! A) j* A  o; Q3 u
int get_key_input(void), K3 W) {  C7 n2 `6 }) z1 @3 G
{( m' S' {; y/ n" i. {& F. s. i
int keyboard;
5 E$ y9 `5 {! }  ?4 a/ K- Eint keyboardcode;
9 k; b% O% E1 Q* J8 q
8 \' U' `9 |! r+ n, N5 Fkeyboard = init_keyboard();
6 a& ~  [% n0 U5 m, s, b* Kdo{: |! B. C5 a1 e% c/ Q6 a
keyboardcode = poll_keyboard(keyboard);
1 {) D% i' Z; M% S7 X4 Xif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 3 h7 }+ u, Z; W$ n$ J
keyboardcode = keyboardcode & 0xFF;
1 h+ K3 p1 O+ A: C$ Y5 Q//
. q3 Y" |, D0 j% i2 }}
' `9 i" x. W6 C- j- S( g' K: H}while( keyboard != 0x58); 9 Z, J. Y; _, n8 R% S6 I
exit_keyboard(keyboard);
/ V) H0 }, S; L2 t6 ereturn 0;* M/ G, G/ o/ z" Q: M* L
}% f6 U+ q5 f. s+ T% l' R

2 _* W. W7 x9 z. m; p% u/ oint exit_keyboard(int keyboard)
' d9 L' Z! `5 c{
, F9 U- o- h( ]; Y; D; r2 eioctl(keyboard, KDSKBMODE, oldmode);
& z# s9 ^8 M4 q* B) Y& V1 Ttcsetattr( keyboard, 0, &old);
! b, Y+ D9 O% r5 k" gclose(keyboard);$ Y0 y7 e# Q/ J9 t" m; T: H6 W
return 0;
" e7 U' A8 U1 }* n" [  p  V$ w}& R% e8 g( L" d# F( p1 ?7 G
int init_keyboard(void)5 a1 v" ]- t* z3 T2 q# K$ E( |2 ]
{- F; f8 E( y$ r
int keyboard;
' P" g9 ]* n) h6 m# ]7 F" K( I2 M0 {- O) x, i; M
keyboard = open("/dev/tty", O_RDONLY);
0 }, x4 |* J1 V: ?5 V9 A# kioctl(keyboard, KDGKBMODE, &oldmode);
* t- q8 n, H5 L2 O3 e6 ptcgetattr( keyboard, &old);% x+ n! G2 O1 i
tcgetattr( keyboard, &new);' m5 h' R6 ~. a0 o1 t/ |9 C2 ~

7 H  F* f) u  i- c7 S+ [* tnew.c_lflag &= ~(ICANON | ECHO | ISIG); % [, G: L! X& Q! r4 J
new.c_iflag = 0;' p' E$ M  I8 T: T3 b6 O
new.c_cc[VMIN] = 0;
5 ?2 [& r  p5 C" K+ unew.c_cc[VTIME] = 1;9 [, c$ P: h% K* F+ h5 n

8 K3 S' g+ g; b7 Ntcsetattr(keyboard, TCSAFLUSH, &new);
" b- X. Y" w1 d" t# V' E" {% ]ioctl(keyboard, KDSKBMODE, K_RAW);: C& \2 i8 v' K
- F" a1 v: D, U; G
return keyboard;
5 Q( k/ S% q" K  |$ Q
7 f) N, G, p' V/ n2 w7 @; A% ^3 g}- s4 G) K, p5 G6 {8 Y1 W" Q
" z* T- f. ?/ L3 i7 M. b, e1 q- Y
int poll_keyboard(int keyboard) 3 c4 Q& i2 C( g  X6 i4 N+ K4 M
{
: F& q: l* l5 `unsigned char buf[5];1 p' a3 ?: M2 ]" f8 i# _. e
int n;, L3 Q4 H2 A1 @0 I1 Y/ P2 c
# a6 v" O: C0 e* \9 K  j) L- Y
int kc = 0;# a! ~  n. {4 K* E* \9 W! `- T
int i = 0;
+ Z0 r- V6 u# e8 n4 E& Lint s = 0;4 m: V& h: |# W
n = read(keyboard, &buf, sizeof(buf)); 8 j  U6 Y2 z0 X' e( S. N
while( i < n){" g" b4 t. J7 Z3 v
s = (buf & 0x80) ? 0:1;
6 k0 j) T+ y1 }4 W3 L7 W. Gs = s << 8;
/ x3 h8 T; s5 Jif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){' p* D& }% v6 V
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
/ ?+ [$ v, r7 {: K* v; ^" i$ Pi += 3;
# H3 `8 m) z0 Y$ n}/ l& l% |) j- N2 K- S* w+ J9 O
else{- `9 Z6 D" o* j3 l; j8 @: G' O
kc = buf & 0x7F;
/ V( O: d+ B+ W" }i++;
+ S* h# w! l1 W$ K- w1 E8 o. Y}' A- I8 z' I& c5 N3 N/ a
}
: C; o6 [+ E/ T' t& c! rkc = s | kc;
1 [# ^9 ?& Q% X5 greturn kc; 5 _' G5 s1 l3 A; Q
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 18:25 , Processed in 0.066671 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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