找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20208|回复: 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。
& S0 Y1 `$ \7 x. N6 u* uKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
* _5 \4 ~. l$ e4 K/ G. K- A2 o- {以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
4 k1 ~3 \' Q& O# z1 x( W也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,7 n$ N9 G1 a' K
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,/ |# C; o7 p4 }' l7 e: E4 v
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。% S/ w  ^6 ~! s  }" e% T) g

/ w; V# @8 b$ F8 `" L: @    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
- P# H( l2 O6 k: y2 F    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
/ P. p) [5 P, {
; q- |7 a- |/ V; ~    请高手指点一下。; @# k. p5 }. F* ~9 B( ?+ t
0 _8 Y: b  b1 {# M" _1 M* U
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> * M, c7 u& f6 `% A( P- W. @. ~2 P. I
#include <string.h> : Z1 s' u5 g5 R8 C
#include <errno.h> ' n! h( I) y6 _5 T; _0 L& r
#include <unistd.h>
8 d4 ~# m* H: T$ U- E3 b* y7 l#include <fcntl.h>
$ J3 }, b& Z! ]#include <linux/kd.h>& Y) u4 ^7 Q9 L3 [+ S0 l5 x
#include <linux/keyboard.h> $ ~$ h9 W! M( f  e* F
#include <termios.h>
, O( W7 F% o( X- s3 i% o3 f; U' U3 |1 ~& ]+ F1 r

2 J4 X3 c$ c+ b#define KEY_DOWN 0x100
$ z! G9 T5 ~6 n; D5 x  c+ Q#define KEY_UP 0x0000 @( e, ^/ Z% z* @

  O) y& b7 o$ V' ^$ Bint oldmode;
6 L0 _( U+ |/ g- n3 w% ]& T. l0 e) Q! J3 c  F% ?" u8 }
struct termios new;- Z6 _# i& O& I5 K6 d7 k/ g
struct termios old;9 E! ]# Z  s  c+ k$ W
2 t+ X7 \' M6 ]9 U
int get_key_input(void)
$ K& ]$ s' N$ |# b/ R{1 {9 G0 J8 O& b/ a5 r
int keyboard;
1 [- `& S# `( U& j& s( d% hint keyboardcode;7 n/ g; k  M" w- p- t- a; [+ t
4 ~  b' T9 g7 t1 g
keyboard = init_keyboard();
, {: A7 O# ~* }* \' pdo{
- C- H) N5 V6 D( ?& E1 h! J% skeyboardcode = poll_keyboard(keyboard); 6 X/ O6 ?" U9 V& h
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ ; M- _+ c0 W8 E- i2 W
keyboardcode = keyboardcode & 0xFF;
8 u& c4 z& S4 b//
* J, H9 f3 {! m0 J7 J}1 n- t, ~* g: t" A* V' a
}while( keyboard != 0x58); / E& l2 e! p: C9 Y! T, F
exit_keyboard(keyboard);. A- p8 H1 l8 W* K$ S
return 0;
/ x  P' l( o5 e1 E}+ o4 p# P$ y# y* c7 V. \

. K9 H) O: J& t& J; a! h9 d9 Bint exit_keyboard(int keyboard)& e/ f- h4 e) H  F" N
{8 h7 @2 g8 X, y
ioctl(keyboard, KDSKBMODE, oldmode);
8 N  f; z9 s0 rtcsetattr( keyboard, 0, &old);
/ \3 e/ L; n& K5 n) W* r* Mclose(keyboard);
, W( {) ]: C7 J0 `# Jreturn 0;
  C+ F% w  e% Y}; Y7 s* `" }1 R" w- c
int init_keyboard(void): T5 ~% v- @6 y3 G6 e
{
$ U- I: J! \2 e* Z7 ]" y3 `$ dint keyboard;
+ `5 J- L+ M* j7 g4 `' L4 r. U  [) Y6 }8 d
keyboard = open("/dev/tty", O_RDONLY);9 W- K' o' h1 ~/ Q
ioctl(keyboard, KDGKBMODE, &oldmode);
' j) c* Z5 _4 O1 F) G, Rtcgetattr( keyboard, &old);8 T6 C3 h; s  s- }! n! C  k3 [4 i
tcgetattr( keyboard, &new);0 z; J: J; ^7 i
: p  E: o  T1 f# ]- S% H9 T
new.c_lflag &= ~(ICANON | ECHO | ISIG); 2 _% w0 w3 K( q: y2 ?7 D
new.c_iflag = 0;! W! d) p! H8 M% Q9 E3 r6 H
new.c_cc[VMIN] = 0;
8 v& p+ e; `4 {: s, d; Mnew.c_cc[VTIME] = 1;
. d: H/ v, N2 a
6 S9 L8 S4 g  D  Htcsetattr(keyboard, TCSAFLUSH, &new);
& J/ w3 I7 ]+ _: y# N7 dioctl(keyboard, KDSKBMODE, K_RAW);3 F7 Y- {3 c- F* H3 _3 h
+ F/ o; ^- O, P7 J. X. w) x) }
return keyboard;
. y; ^; ]' _% W' C0 V
) ^) F) t* Z# T6 v/ O}+ H3 B4 W* b3 K( t' v5 g3 r
5 U% @. B7 z1 G7 c" T, S" k
int poll_keyboard(int keyboard) 8 |! }/ c2 e$ P6 K
{ ) e) {8 z$ t; @* U* H
unsigned char buf[5];" o. o2 ^% q; s$ G; i) w' A
int n;
" @* ?* @+ {1 g, |6 h
. ]" U( T, ~2 q( q  pint kc = 0;  V  |' J6 `, B$ `+ W/ z
int i = 0;
9 X$ [& P6 z$ N* m7 fint s = 0;/ x! b% ^3 f+ _, ^* |; Z( t
n = read(keyboard, &buf, sizeof(buf)); : i4 l: a2 U, Y
while( i < n){
4 y* L+ c( U$ s. Vs = (buf & 0x80) ? 0:1;: Q: y' m7 m* s7 e$ [  ~1 t
s = s << 8;4 O  P- n. j' X: v& v* [2 F
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
4 u% @/ D7 z" o% Ekc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);2 ~7 i2 T5 T# y: l8 Q
i += 3;
1 J8 v7 w! t- ~$ H( {}  V8 c6 d/ h5 M' M$ ]
else{
$ G: N8 P3 S/ T6 T7 N4 N/ ?kc = buf & 0x7F;  o) i/ r1 G+ d1 z6 y
i++;
2 C- M4 }- T. q" {}  T* J' H# v0 C" ~3 N
}& L) L7 S/ r6 A! d+ u1 o
kc = s | kc;4 [+ X) S9 V# q- p+ o1 k+ N
return kc;
" {5 G3 H! g( |6 \( F}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:55 , Processed in 1.278661 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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