找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20232|回复: 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。! P! T0 N  C! f1 t
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
1 H) K* I6 K. P' u0 W以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
8 b3 P* H1 x% ?) w. V) E键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
! o* D" X# B" l0 I9 h* K另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。' M, \& t- `+ p6 h' J! x

2 z  V6 _- a  A3 t9 I+ K+ u    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。* y2 @" s; s. i) O
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。! u9 ~; a" I4 [/ o0 Y( ?1 q

. d" @. U. h% N# X    请高手指点一下。- H6 j! |0 [$ _6 L  L) l) w
& x. a8 p% z; J7 J. C- r) n
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
9 X5 S9 {  s- {% e; `3 \2 s#include <string.h> ! o7 h9 ~* ]. T3 e4 Z/ `# F
#include <errno.h> . m, Q' }  b* z. ]' U: }5 m$ e7 U4 H
#include <unistd.h>
2 a/ D8 ?' v8 I4 `: m; `9 k#include <fcntl.h> ; W: ~  Y" Q9 V) G& f# }3 q
#include <linux/kd.h>+ x: r) |6 h8 a$ `5 _! A! i
#include <linux/keyboard.h> 3 ^3 Q5 C. C1 L/ f9 X3 c
#include <termios.h>
- N# t; q2 L8 p) h& W5 D% p/ C& ?6 ?/ O. S' k1 J
; ^; z6 ^: I& G$ O$ y* R' k* _6 Z
#define KEY_DOWN 0x100" r' C; ]% V7 d( f1 \5 F$ q; n( T
#define KEY_UP 0x000
! s# |$ s2 s& e/ ~, j. G0 @
) V5 x  `* h; `' {  D; N2 pint oldmode;4 k" V3 b$ |7 s6 Y6 t
1 Q( U0 x! H6 f, N% |5 T& ?% |! Q
struct termios new;4 X0 O$ Y0 ?$ x+ O! F* n
struct termios old;) f  s; e5 @/ u& @' b  A: Q

5 w. l6 F2 n9 H6 J/ ]int get_key_input(void)
6 w  W6 u: I8 @{
/ V3 c: }$ s; I; x) N; d; Eint keyboard;
* f7 p4 W4 Z1 O" k4 e0 uint keyboardcode;
1 v( O) L. e  y8 F% e" Z/ H, V* F$ c# k0 X$ Z$ A  ^
keyboard = init_keyboard();
) x2 E) F8 L* B" F+ v3 ?/ ido{+ w3 Z. Q( A% {" ^0 e5 n( o& h8 Q  |
keyboardcode = poll_keyboard(keyboard);
' ?' P. b7 c8 e# H# Mif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 3 c* }& m: I2 F8 G4 V
keyboardcode = keyboardcode & 0xFF;- V. ]  P# `* W/ ]# F/ q8 n9 @
//3 G( R3 n) k4 V; N! A# R3 Q
}4 ?- W& H0 |# ]. x4 f
}while( keyboard != 0x58);
6 M3 U0 Y4 @2 eexit_keyboard(keyboard);4 D/ @) @) x6 P* x* x( u) U
return 0;
7 ]' k8 P6 B8 v}
% C6 J' ]0 p, Q. q8 u, X7 M5 n/ q  l$ k2 w
int exit_keyboard(int keyboard)) s$ D! {) {7 U$ j. c
{# `9 f# a0 d6 u
ioctl(keyboard, KDSKBMODE, oldmode);
( [/ w  A/ R* f2 p3 R" jtcsetattr( keyboard, 0, &old);
- ]0 D2 J4 S5 D6 |; B. m( j: t  r" aclose(keyboard);# m3 }/ H) f0 [
return 0;' e! \8 R% m6 d1 I& ?3 Z9 L
}
- A' r3 W. ~9 }( d1 H) v* Mint init_keyboard(void)! J- z' o6 x- }2 U; ]
{4 u1 X  g# B) V2 l% T, `9 t
int keyboard;) p* ^  u# b3 P" `: Y, i
$ X6 Y/ J2 E# B
keyboard = open("/dev/tty", O_RDONLY);
0 a$ V: `; c2 E8 e$ kioctl(keyboard, KDGKBMODE, &oldmode);
% b# [7 V1 j2 B( B+ U0 _9 b4 H7 Vtcgetattr( keyboard, &old);
; _4 n5 r& b/ [7 T: ptcgetattr( keyboard, &new);: k( e! D0 z( f4 |; F) \( I
3 s0 n3 c2 b9 h9 z
new.c_lflag &= ~(ICANON | ECHO | ISIG); # N0 a5 Y1 d- u: c
new.c_iflag = 0;
/ m" s0 X( p( [5 l# J/ Jnew.c_cc[VMIN] = 0;
1 w" K3 v; b8 T6 Qnew.c_cc[VTIME] = 1;
5 A' B3 _7 ]' M3 y4 l% k9 o+ t. C9 G
tcsetattr(keyboard, TCSAFLUSH, &new);
3 m& E' ]0 o9 }. X7 W. I3 `+ oioctl(keyboard, KDSKBMODE, K_RAW);; [+ I; q& K( ^* H) t
$ v5 D/ ^& d0 }: `/ y6 `1 h
return keyboard;
& Q9 D) _+ X$ {( V" d+ c7 @1 I- q! }
}
9 a2 f  x1 |8 S& m7 c6 E, e. T; |& M/ D
4 r! y0 e9 |1 U1 e8 h. t  ?4 Z" Iint poll_keyboard(int keyboard) 6 e5 F' m- D) Y9 a7 R$ q* d- r
{ 7 Y( j9 }. b# f1 J+ ^/ B' G
unsigned char buf[5];* j6 y! J+ v3 w
int n;
( Z* h5 ~3 [& _- r4 r$ H; e, H" x5 a& C# y" y8 F
int kc = 0;
: j! e3 L# D0 g8 z! B( B. ]int i = 0;
, ~  h% a% m: \# c- Nint s = 0;0 R0 c, t/ A) T; \1 r; ^
n = read(keyboard, &buf, sizeof(buf)); 4 ^* c5 c0 [( @- q% S2 H! N
while( i < n){
  I  @% X0 t2 w- {) es = (buf & 0x80) ? 0:1;
1 P+ \. S8 l9 Y/ [* m* cs = s << 8;
/ d- N5 B* z3 n% h. g$ Eif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
" f, O) u6 M% X  P6 Z! R* fkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
  H) H. c  x9 ?5 Ti += 3;
" ?' `% [/ S# g4 k1 g- Y}) Y$ D+ @5 @" }7 y) G$ D* \
else{* @$ f( Z( N+ X. E/ p! N
kc = buf & 0x7F;
( F8 G, e. R" q3 }+ F) G  ]i++;
% t4 D8 r0 q% X5 g/ [}' E+ v2 Q$ |7 B. O& m+ D# |
}
% X! p6 n4 I. H* Tkc = s | kc;& ?& \7 P8 J+ F, V2 ~1 E8 o" C' P
return kc; - N4 c$ D% C- k, _# O
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 18:56 , Processed in 0.066017 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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