找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20118|回复: 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。! j1 h2 m- [9 a1 w/ D( Z3 k: ?
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
9 K0 W0 O$ Q* [+ H% u以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
+ t+ q/ [: S5 V! c, e7 ?( |键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
4 s; Y5 d$ Q/ r2 N4 o另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
7 z; L- {- r2 @. e5 w9 Y$ S
# D: G' ~* K- n    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
% ~: a0 |, h7 S+ S7 E8 |+ B    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。& y0 p5 }5 L4 ?+ n

8 L6 a) H( f- U, S  p    请高手指点一下。
' ?! b, ^* ]  {& P( R6 x; {, V* c+ J/ F% u
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
, K; i8 K- l" ?' ~8 d#include <string.h> , i8 V" u' w  ?: u9 N
#include <errno.h> 7 H* G6 I- t% z6 T4 F
#include <unistd.h>
; U- Y4 l3 Z. L, d& m7 n# X#include <fcntl.h> . w+ s5 p! a7 I% r" k
#include <linux/kd.h>( m5 p4 J3 Q, S; Q8 |- {
#include <linux/keyboard.h> . \0 J9 j7 X% u* f
#include <termios.h>: X1 a; Y( M1 p
  }& n+ V1 @$ }8 k  S$ y

' m- [4 O/ y8 z' ^4 o1 a& I#define KEY_DOWN 0x100' E2 d) {( G: m  z
#define KEY_UP 0x000
# S7 I# I! ^! {( K0 f
3 C0 U9 w/ e% Y2 S4 @/ Q+ t% Y" [int oldmode;( O  L# R7 H' k0 y0 \

: n( k5 k$ K. n, t8 {struct termios new;$ [1 Z) O6 I0 h. a- N" m+ E% q
struct termios old;
) a* [" ]4 g$ r- c* N$ `' D" _
0 w" |5 Q, k4 J, g* u* G' C% K9 U3 o, Qint get_key_input(void)
* F. B5 ?9 n, v8 t{
) _  z6 m: I' W& ^2 |1 aint keyboard;: }: `* o" J2 j0 o( h- I
int keyboardcode;( q& O/ h8 u: z- j2 b) w2 }* R
7 }6 w/ ~; Z# i) Y* Y* q
keyboard = init_keyboard();* I# {! w& `+ Z0 Y! F
do{
7 A3 [- n- B6 p: R. u+ m# Y2 y8 ykeyboardcode = poll_keyboard(keyboard); + f! U2 P4 o0 s8 i
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
# H$ u1 I- i( ^6 zkeyboardcode = keyboardcode & 0xFF;0 V8 w4 S* W+ V+ \& q: Q4 M
//
  j6 r( d: h0 G% u  e; G) _2 Q}! P$ P. `& T# N
}while( keyboard != 0x58); ) I: \3 z+ ~2 y
exit_keyboard(keyboard);
% h. [: f8 ?$ e: ]- Mreturn 0;+ ]0 x( m& Z) R2 N, x# r# a4 `
}
% Q2 V4 }: Q. w, W; Y( x3 U/ O7 Q
" v# @+ l4 d& X7 X9 ^int exit_keyboard(int keyboard)
1 J1 N; S# J: E{
1 T/ d' _7 q3 ^0 r* L( Eioctl(keyboard, KDSKBMODE, oldmode);2 C+ I$ M: }3 |% E5 t
tcsetattr( keyboard, 0, &old);
! s! S/ e7 X$ a5 C. T% hclose(keyboard);
- G5 E+ L% z( p" vreturn 0;2 V3 [7 p4 l+ g6 u5 d, S) T
}
! G3 h3 A9 A3 n+ P9 Mint init_keyboard(void)
6 f- {* [2 R, _* F; ]3 I{. }! v. {, \  T2 w( P
int keyboard;4 z/ h( L  Q7 X+ E1 @
  |* i& X* P1 h% ?
keyboard = open("/dev/tty", O_RDONLY);
3 Q- [9 N8 ^. ~: Y; \ioctl(keyboard, KDGKBMODE, &oldmode);( m: i! ?2 r; A
tcgetattr( keyboard, &old);
$ [; U! q3 Q0 {; y6 D, itcgetattr( keyboard, &new);
* i0 j, |: y% c& r+ M4 {# j6 s& D/ n- W  F
new.c_lflag &= ~(ICANON | ECHO | ISIG); % n, [) X) D6 M$ W* y
new.c_iflag = 0;
% j4 `$ w$ s$ C4 K9 Anew.c_cc[VMIN] = 0;
& y7 C" \6 }0 a1 @5 k$ xnew.c_cc[VTIME] = 1;
& R3 _# J1 Z! s8 D& H( x  E8 F& P2 D. R" t$ |
tcsetattr(keyboard, TCSAFLUSH, &new);) h4 P. I; p/ e* Z( ~$ G% S1 u
ioctl(keyboard, KDSKBMODE, K_RAW);
! l0 C( Z0 T$ R0 P
, Z+ O2 C' s# ]3 \; s% D3 P3 nreturn keyboard;. C" ]) E6 u+ a* `

% f- L$ B' V: @9 i9 G}
% }! _1 w" \: x, m. r0 ~  Y1 p9 n7 O; x) X* c0 b
int poll_keyboard(int keyboard)
5 h+ j; G2 c7 T( r  O  K# _{
3 H' \: q9 O: o; {7 G2 L6 Munsigned char buf[5];2 \& b8 Q1 \2 a1 P( P
int n;
  S7 R! A2 C7 I$ x: {
. s: ^! D' M8 mint kc = 0;
, R2 l6 V! D& C& c: vint i = 0;
7 a7 y" ]# z& S; E8 ?7 r1 b  eint s = 0;) D0 Q& V& ~, D4 q. R6 L
n = read(keyboard, &buf, sizeof(buf));
% i7 _  Y- R+ R: qwhile( i < n){+ N# z9 ~  w# d
s = (buf & 0x80) ? 0:1;; n3 v9 O) q1 q) i  y
s = s << 8;
: s% M# d* \$ x: \4 `, e! X* N! U. aif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
# \/ ?5 S& Y( T. q" r  k* `3 X  P- T6 Ckc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
7 p( {6 H* ?/ u( k* H# ~i += 3;
% j% W: o/ I- m5 H}1 [$ m" X- A/ c: b1 {
else{
( b# H' \5 d3 o' w3 gkc = buf & 0x7F;
) I# `7 _* g; ?* P% ai++;
$ b- I3 K6 J; ]# e! l& P}
! M/ f& _  e# \* _}
$ H/ @: N/ N2 f/ s. k, Ekc = s | kc;
' L- Q# k4 W. C5 J1 Yreturn kc; $ {$ Q; a4 h. e# n5 m9 }! |5 Z4 Z
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:39 , Processed in 0.039429 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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