找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18753|回复: 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。
8 Y1 i  q) q' {: {6 N& oKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq& K4 w; ?4 a/ _
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。) Q3 s( a% b+ l' k6 m
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
+ Y0 q& `# v' ]8 ^/ T% ^' G键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,2 o! w1 N$ E  Q7 b% X
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
6 i- e2 [, j7 [8 H$ G& L+ @
% l- q  I1 q" t0 R' t1 \    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。) z) n% Y" a& ^& A7 I$ n6 P# }" D
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
3 G8 v' F% S/ b! Y+ H$ t- m
4 |8 j" l& s4 `    请高手指点一下。
- P/ @+ ~5 H; X9 i0 h  h- r7 x
7 E6 ~* d& ?8 w9 R2 x# G. V    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
% L$ T6 d1 H' f) G#include <string.h> ! h, r  d7 J0 P6 {' c
#include <errno.h>
3 v( y) J7 \' C, ^' _#include <unistd.h>
# i/ \$ d1 ^. B. q; U2 h$ o#include <fcntl.h>   H  D) X) Y9 r
#include <linux/kd.h>
3 f: J9 k' R& O6 f/ r#include <linux/keyboard.h> ; M. \, R9 w' t; _8 j
#include <termios.h>
( U1 Z  R7 r1 ^
' }4 r4 O# B( {- G+ n6 G8 F* E
+ v6 q% U5 q/ m- q0 O  ]+ O) \#define KEY_DOWN 0x1000 J7 c' a2 [) L5 t6 N* X. Z
#define KEY_UP 0x0006 Y/ d& s# w8 n/ W6 |# p+ `

4 X* Z! O" J* l5 b; Yint oldmode;
9 t! L9 y  O& N; s! n. k+ O0 {1 t% B% p9 E; o  w2 Y4 C1 K
struct termios new;& X/ }" r# r4 _  z' H4 P2 s5 h
struct termios old;
8 y- y& O2 ^* q8 Y" V: g
( x- R, D& f+ O( cint get_key_input(void)
, `, T$ N$ u8 {  T{
2 ?4 M1 }. o( |7 [4 _int keyboard;
  u8 G" }+ c8 M- v% P* fint keyboardcode;
" K* N7 a- u$ o( R# G0 m) W" _: i
7 ~4 V3 O$ l4 Y; X4 C; \: ]keyboard = init_keyboard();( c# H) a( ]' C" G9 \- ^
do{/ m: \1 b' U+ Q" Y/ x
keyboardcode = poll_keyboard(keyboard); / K1 m. `1 |) F* w. O% Q1 P" d
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ ! {0 s) R( \5 I
keyboardcode = keyboardcode & 0xFF;
+ z2 e' F* _: h) M7 d7 u9 t2 T( E//
' F* z/ f2 I6 W}
3 v5 I1 a% J: G9 Y}while( keyboard != 0x58); ( p: Q( u9 v2 n7 m" a
exit_keyboard(keyboard);
2 E$ n" U4 ?: I* B+ creturn 0;* N6 ~7 r) A' d* w" ]& P
}* D/ D% j4 r; I; P3 f* m1 g
, S% U& t+ Z% j, C
int exit_keyboard(int keyboard)
3 C2 I) C/ Q9 ?; G4 O{
3 j  {$ s: e2 sioctl(keyboard, KDSKBMODE, oldmode);) X' U3 o/ ~3 ]! b( I
tcsetattr( keyboard, 0, &old);
. m. Y+ h, s2 q. u- X* ~; Eclose(keyboard);
1 K- n7 O1 J. Q6 Y6 |# nreturn 0;
% v; I5 [* T6 u0 Q( }3 I}+ c& E! W4 v7 P& ~3 y% P
int init_keyboard(void)/ U  f) |1 t3 h) D* E) k
{% A0 D+ f; N. S+ S* Y  L  }. d
int keyboard;
! y/ D6 p  n# S3 @9 a
: a( x. I2 `; m0 w( Zkeyboard = open("/dev/tty", O_RDONLY);
7 |! H: \4 O* r9 `( E1 qioctl(keyboard, KDGKBMODE, &oldmode);
( K7 {( v3 m/ f/ ]tcgetattr( keyboard, &old);5 ]' ^8 @+ K( T1 c, {4 _+ h. @
tcgetattr( keyboard, &new);
5 E/ {* I. B0 m* T
" z- N  h1 [: O: x/ L; Unew.c_lflag &= ~(ICANON | ECHO | ISIG);
0 i4 p/ ]& ^6 ynew.c_iflag = 0;. S# u! T$ C; \* T" f( a# L. J
new.c_cc[VMIN] = 0;
6 N, _, q. `3 R9 m( h8 Hnew.c_cc[VTIME] = 1;' s5 [+ D4 n4 m/ L  _; E5 E
* S# A. v  P! N0 j& R
tcsetattr(keyboard, TCSAFLUSH, &new);; ~: r6 |' A# b) \
ioctl(keyboard, KDSKBMODE, K_RAW);1 A4 p6 \% D* `3 ~
% ?; P. P# X' @+ G! l
return keyboard;
# e  w" S0 {8 W) ?+ R0 ?# `$ n3 h) l7 K1 \) S! r6 |
}
. g7 Z) A5 Q2 j! H6 \; U' l8 g; M) s' r! D6 {. V3 ]: V$ S
int poll_keyboard(int keyboard)
8 M3 ]: Y' y8 j{
7 S  N+ z! Q) M" D* Xunsigned char buf[5];) F. _# F; n# \! C4 u  r
int n;8 q7 D% I+ H0 k

$ E! K0 `( P" n) M, e7 s* Fint kc = 0;; f0 N7 |) r1 }$ U
int i = 0;0 H1 k) M$ |& e
int s = 0;, A. F8 `1 ~0 u
n = read(keyboard, &buf, sizeof(buf));
1 L, x3 v% R  j% ^* Owhile( i < n){( i5 G' v- U8 `3 A- L0 M
s = (buf & 0x80) ? 0:1;
0 @; ?/ w3 v$ Q$ Zs = s << 8;3 [# n9 F* K2 o
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
9 M; O& C* B# E! {kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);# G$ O. N- J- U; y: C* E+ M
i += 3;2 E- u6 ?4 }) c7 k6 n$ M; ^! ?
}$ y5 |  A- ]/ k7 W1 `5 N
else{- B4 F# b$ j& z5 T# A0 {1 n/ ]
kc = buf & 0x7F;
# h3 b& P  ~: J- r7 f! W  si++;* H( A* @: w# V6 l9 L9 \" i
}
% v, }  ?5 O" `) X* H/ A" b1 w}
5 l0 U) f3 O! m8 l  Zkc = s | kc;
9 G3 B* X0 H9 A8 J; q* xreturn kc;
# e+ T/ M. M3 v}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:13 , Processed in 0.029762 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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