找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20060|回复: 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。
$ j' r( q4 g1 Z2 KKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq/ C& ^5 A7 Y5 o; @' u  D( W
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。3 w7 o1 s3 y) g$ ]" c4 j
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,* n) H4 Y# ?8 I; f' r
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,/ r2 m- p" \: D6 L
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。8 z  w! N$ p6 ^- u% Z6 \
9 [6 M2 Z5 g1 B! v5 b
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
" x" U  D" o% |1 ?    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。: X& w& Q! A+ p' E/ k
2 `! P# f# d4 u3 M) F& o5 g* Q( L/ I
    请高手指点一下。% `2 {( }% w+ S5 r4 v. }1 `* ^

* L5 S: G) P# b" u4 T6 I* P# G5 z    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 2 s+ y( o" {* T4 x6 M! B" Q
#include <string.h> ! h) I2 k' t* d) y$ J
#include <errno.h> 6 D% w6 e/ v0 D8 j8 v  a9 Z1 P" U
#include <unistd.h> - g% Z( v- x. k* z3 Y* C
#include <fcntl.h>
8 h& B& a/ Z; d8 b#include <linux/kd.h>* d8 I7 n% S4 H6 ?
#include <linux/keyboard.h> , ?1 Z+ W# c& N% t; |4 x3 C
#include <termios.h># R# X" f+ }4 D% ~9 N4 f# Q9 B6 d( L
8 P- E% E7 w* ^6 I" I8 E  w

  E4 x1 S7 O, ?5 i5 X#define KEY_DOWN 0x100. O$ G1 B- M4 b: h0 X0 T5 r
#define KEY_UP 0x000: x: x: y/ E  s8 w

! s, x! z' r4 b' I/ g( c0 q3 O8 Cint oldmode;
2 I* g/ ^& W% u$ M  A/ u1 @- t+ J% M3 r) w1 `! ]1 _& r' k
struct termios new;
; p+ G& }- S, R: m& qstruct termios old;
' _- M+ `1 p  ~6 ?5 ?; S. Q. X, E) q0 C% p& I5 d' q' A
int get_key_input(void)  r( Y; G  d- B9 j( `; P. y  F
{- @4 p$ [7 H! }7 V3 O0 A% t3 o- R
int keyboard;
- X" @( f) D) A1 `+ jint keyboardcode;" l0 {) z4 y% E* N) B, O& ^

- G$ `" u) [* I! ^5 @keyboard = init_keyboard();( F5 N) l  O# p
do{
4 p  L' n; Z# @$ m2 @keyboardcode = poll_keyboard(keyboard); $ S' x4 R  R- B
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 3 b; w( p- V/ |0 r
keyboardcode = keyboardcode & 0xFF;  h- W+ h* m* x$ C4 g" L
//1 w: w7 }& f. A/ z; ~9 L* P* H
}
5 Z& ]5 h  [; \5 f}while( keyboard != 0x58); 3 ]  F$ K- w! s9 P
exit_keyboard(keyboard);8 U7 D  o/ N2 i( W/ d
return 0;# k  X" H. ?5 ^3 d. R
}
! j+ a' q, Z2 |* T" T
! F+ t, Z  S" A7 C' z) eint exit_keyboard(int keyboard)
' g/ _) s: j/ J{
3 Q5 _( J* b' {6 P+ d$ sioctl(keyboard, KDSKBMODE, oldmode);" H4 @4 f8 w; V$ E
tcsetattr( keyboard, 0, &old);" F1 G# a# |) O, w
close(keyboard);
+ b5 J' a- y: j& `* |- a* Ureturn 0;7 V2 f4 z# ?! e5 F, Z
}! t- Q0 n& ~" b; p- I, Y- X/ |0 G
int init_keyboard(void)
' M# O1 Q4 I. |+ P{
* g/ ^, ]! h" T* ?int keyboard;
0 ~% ^: Z& M. B, [* D4 L0 C9 n" s' u, a4 a* r4 j3 O7 d
keyboard = open("/dev/tty", O_RDONLY);# K/ Y) Q& m! v4 v5 m8 w1 L
ioctl(keyboard, KDGKBMODE, &oldmode);
# i% J. @6 x* [6 D$ Ctcgetattr( keyboard, &old);9 ?4 L) ?) T9 s* F
tcgetattr( keyboard, &new);
% R) c, F1 |9 k2 h# e! _3 F, Z' u) D! J4 H
new.c_lflag &= ~(ICANON | ECHO | ISIG);
& i; ~6 q9 ^! }new.c_iflag = 0;
* @! w; J1 \8 W, Y4 knew.c_cc[VMIN] = 0;: `$ p+ ~2 I( }+ v
new.c_cc[VTIME] = 1;
' j  f- M3 l; O+ J# c, T
# ]6 T. ^; N6 Wtcsetattr(keyboard, TCSAFLUSH, &new);
, [$ G5 ]  X6 x& |ioctl(keyboard, KDSKBMODE, K_RAW);
/ K4 d: s& ~3 R+ }& d" ]& p4 Y; @, O8 L, `
return keyboard;
$ e2 x" @- V% S$ g0 L# J$ ~- G# v9 Z  ]8 V% Y
}
  w, I8 ?4 k+ `$ ?4 H7 L) V. _4 z1 J# N3 I, @+ q4 Q- t- d* c3 \
int poll_keyboard(int keyboard) 0 h; e" C) i% D9 z  D& w9 v
{ ' @( T! k; p3 U
unsigned char buf[5];3 \- f! }( a9 T: Q$ F
int n;
6 d3 V  K: C' m1 M, n, y( _4 B6 G  D# z
: i+ P# G) ^1 Z/ Dint kc = 0;- {# C# }- O4 s2 B" |0 {
int i = 0;; q- e9 p7 r. K) O+ s
int s = 0;
& z; |) L% s6 l! T' b! T1 f' Qn = read(keyboard, &buf, sizeof(buf)); 7 a* J0 ]6 q+ d5 o( x" H2 z9 ]
while( i < n){2 X" ^3 ~- c# e3 I
s = (buf & 0x80) ? 0:1;, A$ a9 q( A1 [% q+ @
s = s << 8;7 [4 L6 H. t5 v) ?
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
3 ~; o( T0 V- M4 d- ykc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);6 ?: v+ a3 ^+ x2 K0 [. s
i += 3;! G: e8 b0 k: f: J" d8 u
}) `3 {/ ?( K0 c( l! U+ V) X
else{/ _( i; R) o& J! t6 B
kc = buf & 0x7F;
' n! z$ |" ~& ji++;* i; f/ t7 _: S0 ^* U
}
! a4 |* n' m. U  `& a}" V/ v3 ]$ e; e# g- Y6 |! c
kc = s | kc;; a) X5 j/ }. |5 C) ^
return kc;
  f$ U3 k, i: L! W}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 14:33 , Processed in 0.070407 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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