找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19654|回复: 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。) E7 Z. ?% {" F, I8 c; q* y7 o
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq# `) E8 s; I/ \: }- H* h- N
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
3 ]- c- l- O4 F/ |也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,5 g, S/ F, ?2 E7 w+ P9 n4 ~9 [
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,9 z3 M9 o3 Z4 Q5 x; E
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。; V8 ^, u* }' Y0 n/ j# b6 A
0 o' l5 p% X/ T% Q6 R- T$ ~
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。& Z4 Y" a+ B% y& O' v# O
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。6 @! w: i2 M0 d

& y, Q5 g# Y& g) _    请高手指点一下。
5 m! o# p! I% p# E" A( {
7 ~1 i% A. C) n0 H! K3 ~3 |    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> & V1 e4 l# T  P8 l6 @: ^
#include <string.h>
4 q4 {3 d+ c- k#include <errno.h> " L- m$ g4 Q, K: X$ U" W
#include <unistd.h> & X1 Y; P3 L4 A
#include <fcntl.h> " g$ p% C& ~5 F
#include <linux/kd.h>/ ^- m5 `6 r4 f. Q; {* s
#include <linux/keyboard.h>   P/ x- Z4 f( b; b/ g1 {) c
#include <termios.h>
% B, u; ^! \* G# Q8 ^) Z1 g" I  V
9 L9 S( `2 j& S3 Z
/ v5 l& t# l! k! s# }#define KEY_DOWN 0x100
3 C5 G9 U7 w: N" {! c#define KEY_UP 0x0002 {6 t* ?3 M8 Q9 j! M/ i+ R
% }! Y5 _3 z, `3 b& H1 v/ `; T
int oldmode;( K3 C5 w4 G" l& c

; z8 V  L2 r* \; i; vstruct termios new;
% r0 [- J% ]% E) d& n' \9 _8 A  S: Cstruct termios old;# g3 s" M  V  n/ @! P
  z$ @# W8 i- j( X1 @  z
int get_key_input(void)
$ @3 L' Y9 `# l! W( ?* S{
4 @+ k( ]7 w( C$ E3 `& c) _' zint keyboard;
' _4 b# ^: F+ \8 V4 z4 @9 }int keyboardcode;
7 Q& u' B" {+ e/ w8 W* w# N' b8 D" r9 F: e: E5 f# r1 S) N! R) [4 A: ~' P* ~
keyboard = init_keyboard();
/ C1 L# ?- U) `! A% Z  Ddo{
' c% h2 u! Z7 x7 }keyboardcode = poll_keyboard(keyboard);
* e9 q* M( O5 f& o" v, gif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
" [' u  g3 z2 Tkeyboardcode = keyboardcode & 0xFF;
. N6 {: N) d- f- i. c) f//
1 Z7 m+ w/ l; @' s}
$ P/ `; S# t, x1 i}while( keyboard != 0x58);
; `4 L& y& H4 c  cexit_keyboard(keyboard);
6 L9 E4 Z5 C) `! ^0 V/ M5 v8 E. ?return 0;
, q( j+ I; J9 L8 p4 j3 w0 V}- M6 _1 m6 M6 u/ y3 j
: ]7 n( [- C) g. K. \
int exit_keyboard(int keyboard)
( j5 ~8 e: h% F: S! Z{
% l8 f( Q" m; A- F0 e) @( ?) fioctl(keyboard, KDSKBMODE, oldmode);
1 L. A8 J% o6 ]) B' B# F# a- dtcsetattr( keyboard, 0, &old);8 I* @- `$ i% h/ a4 |' u5 w
close(keyboard);
1 c( i* d9 ]! Z6 A; a) @return 0;. x/ y% Y1 \' w3 Y* E7 `" }: u
}$ d/ m' ]+ V8 |5 \
int init_keyboard(void)3 }" N/ x0 j0 X9 u( z+ G
{
. h7 B" m* `7 {$ V3 i+ Q. U" gint keyboard;# \( b; Q7 k* D$ n9 @
/ N8 R! _5 Z( p, ~3 ?' G' N* `
keyboard = open("/dev/tty", O_RDONLY);
/ C6 T. k# U; g0 Cioctl(keyboard, KDGKBMODE, &oldmode);
% `' ^& z- T1 htcgetattr( keyboard, &old);9 q4 G8 W: M. u$ O* @7 \
tcgetattr( keyboard, &new);# R' i+ [1 w0 B1 \5 E2 X4 `

2 }9 \* N2 t( `! _" I2 W# unew.c_lflag &= ~(ICANON | ECHO | ISIG); % m  k& Y# {  e9 r
new.c_iflag = 0;
  A8 @! y+ a$ M$ _new.c_cc[VMIN] = 0;
6 ?/ ?  L7 w5 A* ~. Vnew.c_cc[VTIME] = 1;8 j6 w6 u, ^+ F4 c$ I

" N( K3 ~! ~) V) \# F- Ytcsetattr(keyboard, TCSAFLUSH, &new);& J7 f6 s- J4 \$ @
ioctl(keyboard, KDSKBMODE, K_RAW);
$ o. \" R+ Y& e# H
" B  Y3 L3 n  M( T! c$ }; Ireturn keyboard;
  C, ^9 \+ q; ]" T4 C) ^
4 f! H3 U& w' a8 H}
, w! e' u: g3 R1 y/ v5 X
5 E6 g0 W& q( {  aint poll_keyboard(int keyboard) ) l9 I. M' y8 m( D3 G$ d: g: S
{ 1 M! T, |$ s' g( Y( _
unsigned char buf[5];& l' o" Z( \% V1 W0 E/ j, L% N
int n;
$ [6 x, p' @" p
! D) Y+ S6 ^9 Rint kc = 0;
5 r! z/ w" E" {% c/ _& m5 K4 ]int i = 0;
, o% b' o5 s7 o" l2 C5 e# @8 hint s = 0;
8 J/ S9 ~6 U, Z! g  K4 En = read(keyboard, &buf, sizeof(buf)); & R$ @& i/ M( M; Z, c
while( i < n){  @8 r- |! t% h8 I, e/ l$ s& w
s = (buf & 0x80) ? 0:1;  V( r5 S6 Z7 r% X! ~
s = s << 8;
* `+ c6 B: O: I6 D6 _8 `if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
0 V) v1 K/ m0 V: s! o% _kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
5 H! y5 j9 _; X" yi += 3;
0 K  z$ K, u- I1 \}% A8 `  D. u. Z# Q# z7 u% |: L* U
else{
/ W  s' q/ I% W/ N, {8 Nkc = buf & 0x7F;# k. l+ B3 _  i( z/ C& {9 }
i++;$ r# ]! {6 f  n1 ^
}
& K2 a( ~1 f9 f& G$ _) T}) Y" s5 G) j0 w$ K/ C
kc = s | kc;
4 S# @8 x" q. F' A- Mreturn kc;
  I. |1 T  p; o8 F5 W/ K}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:50 , Processed in 0.073621 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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