找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20263|回复: 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。2 Z; N: {, W$ @$ ]% E" ?  N
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq$ R: s1 m5 S3 V3 @9 g# U
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
( H' I: _& P7 H0 J- M9 z也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,6 f+ `6 L: T1 y, i3 X# r
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,- u* R8 C( G6 I& y& ~, [1 A& U9 A* E
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。4 O" D. `0 k# U6 ?/ U9 R
2 A# x% `# z7 ~+ d4 `. |7 y
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
) E- s, w5 X1 S. t" S+ b    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
$ h( q; C" Z6 k3 g# \' r
, a  F! J4 L' ~4 E# r$ T  I+ r    请高手指点一下。
5 ?9 C4 X3 Z& f% L) l" I4 g: ]. {5 v' d6 K& S
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 9 E2 s% l6 `+ s6 i" Z, E& N7 A2 \
#include <string.h> & B$ ^3 W3 L7 i$ N: ]
#include <errno.h>
2 @) o. J0 g# o* L* [' T6 B7 H#include <unistd.h>
5 m' c9 d% Q' Z: a#include <fcntl.h> ) ?  m$ ]2 i/ W! y' W: X0 K: J% I
#include <linux/kd.h>. g; [6 G3 B! i4 j3 F
#include <linux/keyboard.h> + I3 _  B3 V. B9 Y# t! J6 H4 ^
#include <termios.h>
) B/ @3 n! V8 i; t
! e# J& I# e/ G: r# s6 Z3 C9 _6 X0 ~, s& \0 i% I. g% o
#define KEY_DOWN 0x1003 a6 q* `# }0 I: }- I7 c
#define KEY_UP 0x000. u( Y  ]; U; Q( _

2 A; y7 ?% K+ \! [1 K% a$ w" V  J9 Pint oldmode;* A5 H2 s  L% w1 l/ c7 B3 o$ g$ n" S

; f" m3 G2 a( e8 Gstruct termios new;& v) C3 z( h: S& s0 g
struct termios old;( a7 m- D7 U# p+ W) k* ^! d9 o# v

; q% [9 q& g; n' vint get_key_input(void)+ H: s/ F, O% ]; L7 h& q
{! D3 J& S3 v5 {0 ?" g) a$ c" m  ~
int keyboard;' ]+ n/ _/ V( A7 Z
int keyboardcode;! L1 h6 a9 J/ t" e; ~+ a* A8 G4 ~
" C5 T8 B/ c3 ~8 T
keyboard = init_keyboard();
7 t. r! m2 D8 R% ]! W* Ado{
; |. _9 h4 |2 g$ okeyboardcode = poll_keyboard(keyboard); 8 Q, |- k0 ?* X8 X' d3 \( X
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 2 z8 S2 K" [* N" y% ]
keyboardcode = keyboardcode & 0xFF;
5 X9 K; F! |, \  ^, n6 L7 C//
0 E; P3 M! {$ X7 e6 S' p}
% H' V9 h4 @" a6 o; e( l+ G}while( keyboard != 0x58);
# A6 O3 N$ M' U  X3 fexit_keyboard(keyboard);
7 o' q) {8 _  g+ treturn 0;7 @4 A/ I  g6 [) z, h+ ~3 i
}
( F4 m( d2 }8 D/ ]5 X8 k$ P3 q& Z4 d/ n6 b5 R' t1 |' I1 q1 W
int exit_keyboard(int keyboard)
  N: f6 V: B) e6 X7 k4 V{
  p+ |+ }9 w) Uioctl(keyboard, KDSKBMODE, oldmode);; E7 z; M7 X) q
tcsetattr( keyboard, 0, &old);
( M# V! Z$ @: R$ [2 w! v$ Tclose(keyboard);5 B! o4 P0 \4 C2 y3 K7 G
return 0;
5 C' q% ]$ W! J; t- M: O2 R}9 _! D( R' R5 m6 c( N, A. x
int init_keyboard(void). a! e9 w+ v- k0 f  ]4 T, v
{
3 X7 [6 d+ o% n1 `1 A0 Gint keyboard;
! F+ `7 S  Z) {# }# A, L: u/ b, }0 q( L  m# O
keyboard = open("/dev/tty", O_RDONLY);3 F* `9 H2 \8 c* B1 [% e; t. H
ioctl(keyboard, KDGKBMODE, &oldmode);
0 A* ?1 e" W, _& E3 N# @3 Utcgetattr( keyboard, &old);" _2 X( v# M! y0 d7 ^0 I! B
tcgetattr( keyboard, &new);
4 V" Y3 m) p5 U& ^
, G% o' }# ~) l/ c) `, onew.c_lflag &= ~(ICANON | ECHO | ISIG); 1 q, j% J& ]" `  k
new.c_iflag = 0;% S; d% y+ g- h
new.c_cc[VMIN] = 0;
; O+ t! }# W8 j5 a( p; Gnew.c_cc[VTIME] = 1;& w2 F9 T" V- ]9 [' N

( E$ d8 h2 F1 J/ s' G( U( @; }5 `tcsetattr(keyboard, TCSAFLUSH, &new);7 K2 F" t/ g7 v* n
ioctl(keyboard, KDSKBMODE, K_RAW);3 P1 Y" N# q1 g& k/ e

2 |4 W$ j! n& f: M: [return keyboard;
- b0 w8 p' X( o: V' e
8 u  }  r6 A- A}
# R4 M$ b: ?0 P$ J* x4 j2 h/ k, F0 S9 L$ J# |
int poll_keyboard(int keyboard) + C: ^$ N. l3 V  T
{
+ ^; B% E/ T. o6 W2 Y) uunsigned char buf[5];9 _  y9 X" I" ]3 H
int n;
* R% K& |/ O" R- A: W) F! D/ ?/ _! `7 ?. O
int kc = 0;
3 k& i: W1 u0 Y; h+ U, _4 Vint i = 0;
. v( [0 K5 o& J5 bint s = 0;$ C- L; R0 \. B/ I" k" a: {
n = read(keyboard, &buf, sizeof(buf)); 8 S" ~; h* K3 I) d0 P3 g( R
while( i < n){
+ b* l! n% Q- j  K5 K: ]s = (buf & 0x80) ? 0:1;
2 |, B# Y0 D; g5 i3 O$ As = s << 8;
* T+ g, Q% Z" q, O6 F2 B4 J; mif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){# y  c7 ~* M, Y. H' Z7 X3 T4 M
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
) W$ @9 i5 ~- s# U% Y8 p2 T3 S9 c- }i += 3;
. X! E" m5 V  S; u7 |0 m$ ?}
2 e/ L& n/ ^- P4 I: Eelse{
+ C, C1 N: n$ q  u& D& w( Ykc = buf & 0x7F;. ]  s, X5 [& H# Y4 i; J, Q
i++;7 z* q6 Z3 N4 w' P4 Y- e
}& \, `2 r6 }2 ?9 o2 A7 a2 u2 H6 T
}9 j( S, B1 ?) W% _
kc = s | kc;
. }! n6 A7 O2 I; F! _return kc;
+ C+ s# L8 u3 O) s3 s}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:07 , Processed in 1.637960 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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