找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19109|回复: 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。5 C0 T' v) v0 }# [+ }) p
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
' ], ?$ o3 y5 `) D* l5 B以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。" n9 L) v* d4 b1 }( h2 \% G3 l3 w
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,' {5 Q& L; }7 M3 @0 m1 ]
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
# }5 w1 i  G9 {! u* j3 |4 k5 n另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
9 T2 B3 w3 c3 j& y1 m" I; [& P- U
; k+ O# V( ], r: R2 ^3 u% B% [    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。  v9 O! G' _; B; k( l9 C, G3 B
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。3 R, H5 V& b- V
3 L1 @5 E! N* J8 R( {  C
    请高手指点一下。' U9 g# i$ w& z6 ^4 l
" V! Y: v( `& h" G9 E
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
5 Q( X. }+ o- H# {# h9 Y#include <string.h> % m  ^) b0 f$ N
#include <errno.h>
5 c; K7 a, C* f& n  H#include <unistd.h> + s1 h; G* W( q1 ~" v( I5 D
#include <fcntl.h> 8 O9 n' C  U2 j1 ~; i
#include <linux/kd.h>) U& b& {; C9 s8 [
#include <linux/keyboard.h> 3 ^3 n( X' ^2 |. Q
#include <termios.h>
" J8 u4 C' F# F7 K5 L/ b$ u
* G' v- ~2 t6 I) B2 A  B; w0 e& D' [+ b3 W0 f3 k2 ?
#define KEY_DOWN 0x100) K, R. c. P) V7 [9 J  _
#define KEY_UP 0x000  g4 a* p6 Z' K( ]" C/ M

' T/ \) j% b7 D$ |2 C4 `# `% c8 mint oldmode;7 z3 t5 C1 d( M0 \! H2 M3 }: V
/ Q% m* C! n  V1 y- @
struct termios new;4 Y; g1 |5 u# ~  V) i- [
struct termios old;% b3 s, n; k! C7 q* o* W
3 |' Z/ \% J" X3 i; @8 ]/ G' Y" i  k4 \* P
int get_key_input(void)' [2 |6 j0 J0 t7 N
{& h9 b0 i0 d- \4 g: y6 }
int keyboard;
3 g, J8 Z. H; v! }# J: vint keyboardcode;1 u/ m/ w6 a; H0 I* y

* L. Q8 y4 R) B/ A1 a2 g; i) ^keyboard = init_keyboard();
) H5 G# S; L- h! pdo{! {9 A. {, j8 y  x7 Z4 Y% {
keyboardcode = poll_keyboard(keyboard);
7 Y( W! @' Y. e$ }7 K4 x% u6 w. J/ O( ?if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
0 s# p* i  @; Nkeyboardcode = keyboardcode & 0xFF;: u. p. w( U5 f) E( T. N% k
//( i. G, w% m! d6 K0 y. I% u
}# A- R6 |. e1 [' K# L" Y9 V$ s
}while( keyboard != 0x58);
; [! w, c  z7 U9 t& aexit_keyboard(keyboard);
9 b  u* _1 c: [return 0;
, e8 R4 s. l. k! ^  o- B) b: I' z}
, I6 \) p3 @: L, Z
0 u4 u8 ], B" l7 Uint exit_keyboard(int keyboard)
9 G  M  J# U. w7 L{% _( R5 i# o/ E% {# H5 M7 j
ioctl(keyboard, KDSKBMODE, oldmode);0 q, l! Y; K% f+ d
tcsetattr( keyboard, 0, &old);% X: {1 L+ g0 a
close(keyboard);
9 s1 S6 e' j4 a5 X+ K* P+ v3 y4 yreturn 0;3 }$ V% ~% H5 i. Z5 k1 a7 U
}
! U4 T  @( [0 k3 o5 eint init_keyboard(void)
3 ]2 W5 g% ?% f$ f2 X{! x6 K5 Q$ E) p8 J+ K
int keyboard;
& I# {9 _( V4 j! Z7 o3 x
- ]+ I6 B5 o& a8 @) _. S; }0 E5 pkeyboard = open("/dev/tty", O_RDONLY);
! ~( `9 W. V# Vioctl(keyboard, KDGKBMODE, &oldmode);$ `* j. A. b: @: R* C( p( j
tcgetattr( keyboard, &old);% r) P- f: ^; f; [& m9 A
tcgetattr( keyboard, &new);- r! w9 y. P8 E

' g6 L9 B% |1 P+ r* pnew.c_lflag &= ~(ICANON | ECHO | ISIG); - C# `: X' f0 q+ Q9 E
new.c_iflag = 0;8 `% p/ H. {5 a  J
new.c_cc[VMIN] = 0;
0 `5 W$ |" c7 D' O$ xnew.c_cc[VTIME] = 1;
9 [+ p" R4 p6 o4 v: m) _5 J. C" ~1 n* e8 E: [
tcsetattr(keyboard, TCSAFLUSH, &new);
+ d- U4 \- u, L3 Uioctl(keyboard, KDSKBMODE, K_RAW);
4 [. A) s6 T, X" y7 L# Z; l! ^" s( f4 R6 O6 d
return keyboard;, U2 B; o, Z! g+ x) R$ r

1 H- g: {* @6 z7 o1 e, C}
7 n0 ]# x2 v$ c: C; G. d7 Z+ s( i
4 F, ?2 {( U9 v- e$ bint poll_keyboard(int keyboard)
* `2 m5 Z# g, l8 ^' b, L7 R6 E# j{
  E+ I8 m0 e! {2 Sunsigned char buf[5];
, S5 f; q- c% A6 ^2 Dint n;) N6 G4 s4 t' i# e4 p) B& K3 y: Y

  a5 p. {2 m& x2 B9 I" G; Kint kc = 0;! H& F2 F1 m+ C- f& n1 i
int i = 0;: J# y* Q* @- w7 v3 s3 O3 ~
int s = 0;. w5 P' S& T# Z. e9 w
n = read(keyboard, &buf, sizeof(buf)); $ Q% N( X- J2 E/ s: h
while( i < n){0 ?# c- O! J( [) E3 P$ c
s = (buf & 0x80) ? 0:1;! s" I: h+ m% O4 B% ]5 B
s = s << 8;
* D* C/ ?& t- h% ~if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){3 `9 m0 W1 a( R- D  t* |
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);  i; @% G0 L: i" x: I
i += 3;
7 k2 A/ j9 @: |7 t}
& F0 H- I& b0 [% Uelse{$ y+ D2 k7 N. C8 B* ]
kc = buf & 0x7F;
. W: J2 R+ N4 l9 Ci++;
  N: q5 B( I  n4 t( Q% u}
. }0 T- ]! P& W}
: l) o! ]' [/ g2 s/ ]+ Jkc = s | kc;
3 T; Q: m# Y/ P  F* @return kc;
- a& y# f$ u  ^- `# c}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:49 , Processed in 0.031173 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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