找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19775|回复: 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。( o# d8 i, K7 g- u  H
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
3 E+ b% u8 q1 r6 Q以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
" O1 d- r7 {  j0 g6 ]1 s* O* Y也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,5 ~, a" y; O, Y$ m. U- b
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,2 y& d% ~7 o) Z/ k& o
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。+ j' j) N9 a8 K6 ?" x# p
8 u" r: }# I; y, j' `1 N, t. \
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
- ?" {" B5 {# n* [    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。+ `3 y% g/ T! Q! T* ^& v
2 F7 S4 [4 Y/ k( u' A( R
    请高手指点一下。( N; z; L+ b3 X0 t6 o0 H2 P
" h% D6 e9 Y/ }
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
) I  m# \$ b# S/ C; ?* O( t#include <string.h> " E# ^8 O: s4 L
#include <errno.h> 7 A: M3 I& B% {( o$ h  c
#include <unistd.h>
  F1 x7 e% ]: C5 c# P. H3 a7 l#include <fcntl.h> 4 V$ }2 _7 D7 h+ `( b5 M, h+ ~% q# N
#include <linux/kd.h>; v' x+ f0 X. L, E4 [
#include <linux/keyboard.h>   N7 @' X5 G$ |( I: j2 A4 b
#include <termios.h>  p; }- j: w2 r) s

, r! U1 @; D% V1 h/ _) T/ i  a
#define KEY_DOWN 0x100
7 F) ?3 l+ z/ t2 b. O* [+ I, A' f#define KEY_UP 0x000
& n! E  V% _" e: G9 Q
2 Y; u: |" Z- u4 G/ Iint oldmode;% Y2 o4 l( B; l

5 f) H$ c& P! }4 l  ]struct termios new;
+ m. m" J4 g9 r/ r* Bstruct termios old;/ i5 [# y6 x2 P! R8 C/ Y  a2 j

4 R( \; ]% _! p6 E9 O, I% A" T  v' Iint get_key_input(void)
# d/ [& }4 {9 L# J) O{
8 n! v8 I7 R6 V% F0 }int keyboard;
+ q# [- N: [+ @& k) Gint keyboardcode;( D7 ~$ `) L3 e6 b! u
  r1 m9 p$ a9 f  R
keyboard = init_keyboard();+ P0 U( t- h4 v5 F7 a: N3 Y
do{
) F( g0 G$ L* K) h% b( r$ \keyboardcode = poll_keyboard(keyboard); ) `, o% Q' g& a/ h1 G
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
2 r0 s# @3 t# r# Kkeyboardcode = keyboardcode & 0xFF;! h6 h0 J7 ]" l% V! d5 M+ o* B
//6 M! J& _( X0 f4 I
}
( `* q5 f3 c. ~5 X. D; }( t. C}while( keyboard != 0x58); ; a  P: u% I  z6 [+ e: x
exit_keyboard(keyboard);7 n, j$ ~# t+ I. @4 m0 b
return 0;" B- l( K5 P% B9 N2 z
}$ R; M, a6 j* m7 n% l
: a: M8 m- K0 T: p9 G
int exit_keyboard(int keyboard)
5 ?; i! V/ P: n$ a8 a4 B0 a1 s5 d{* i2 _& ~9 @" h1 r" @8 T
ioctl(keyboard, KDSKBMODE, oldmode);- C" l8 J5 w1 ^% M! t
tcsetattr( keyboard, 0, &old);
) F: Q$ I  p3 m) h8 ]+ Oclose(keyboard);& p) E$ u3 s  ~' k$ d1 A
return 0;/ g& ^7 h7 h* @! p
}
4 F: C# M5 j6 p/ t1 Sint init_keyboard(void)* f, u1 ]6 @0 _+ r3 k
{" Y' e$ X2 I8 E0 g# d" A
int keyboard;  y0 Z& Y! S6 d" M2 l/ P0 ?; L9 y

. K, D& Q1 {! @# j% W$ L6 Tkeyboard = open("/dev/tty", O_RDONLY);& n) ?. M# o  G/ j1 H
ioctl(keyboard, KDGKBMODE, &oldmode);
! j; ^6 h- ?8 p3 }0 o4 e$ J- Y6 V$ @tcgetattr( keyboard, &old);
9 d# w# T# a2 d2 I# T1 I) vtcgetattr( keyboard, &new);
8 n7 `( p1 B. m# f; `2 `" ?: d1 C$ ~2 x! a6 N
new.c_lflag &= ~(ICANON | ECHO | ISIG);
. C+ k% o  V' W+ c" Knew.c_iflag = 0;
5 Q( S4 `3 y; A! [% r3 D8 X" ?new.c_cc[VMIN] = 0;3 H1 B" p1 |' S! i/ L
new.c_cc[VTIME] = 1;
- Q2 [$ ~' d3 w2 y9 `8 ~, q
, Q9 T- M8 K6 V( B  V: c: Dtcsetattr(keyboard, TCSAFLUSH, &new);  Z' l  I2 x9 [
ioctl(keyboard, KDSKBMODE, K_RAW);
* n6 N* G& _4 R/ G) ~% c( a
  z! o/ o0 L( c9 F+ Qreturn keyboard;
# J1 _; \% H, L! i/ w& o# x
5 I. w$ q! x4 j2 a+ v5 l, ~5 N}
- e$ h$ w* B4 K6 p& _7 T% S8 u9 J6 q. F( k1 r# _7 c: W
int poll_keyboard(int keyboard)
* z8 g/ G& f+ w8 s/ B& D- I3 s{
1 D" V0 I# \$ dunsigned char buf[5];
- ^5 E0 A% H8 e) z# o  {. \6 Rint n;
  Y& e& _; Y7 K2 ?9 t; t
5 p/ j& ]) s. ?, u  d' V9 m; r- N& D3 Oint kc = 0;: m' X# n. g% j6 R* l3 t0 ^
int i = 0;) j: N# G$ Y5 |; N& m
int s = 0;, z' s6 H& k3 b: \. d
n = read(keyboard, &buf, sizeof(buf)); * I- c# Q( t" N' c- u
while( i < n){
5 P' c# Z- y. L# n6 V# A8 Y5 ks = (buf & 0x80) ? 0:1;6 I8 `* U  W. {' L- _& p
s = s << 8;& o3 S' B8 ~# d9 Z; b% ?
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){9 u. l2 L: b1 j
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);, x: V1 o8 V, K( m3 Q: v/ V8 z
i += 3;
! [/ X( d( K5 L1 G* ^}
7 C# r  |4 V- ?: R7 T! t3 Nelse{
- m* t$ z4 K1 ]' r. skc = buf & 0x7F;( \6 U) _# b1 e
i++;5 g+ t& d1 [, U3 `
}
" o- F! a9 Y3 S* ]+ ~, I% L" a}3 N+ \* J; z: o& b! [  W
kc = s | kc;
: T: X6 l& F- E% J0 F0 n; [return kc; 9 _: S, z3 }3 N3 I: N* _
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:38 , Processed in 0.054536 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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