找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19653|回复: 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。3 p$ Y: x0 h8 T, l5 Y
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
9 ~0 X: {. x- ^+ k以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
4 K* P( P- k: X5 @7 ?% ]. _( Y键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,4 T3 l1 G8 {" m1 n: r3 J
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。7 {7 ^0 M; K- h2 t2 C0 ?
) T- W) D6 Q. \9 I* f  x- p
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
* R* q6 z* J8 W    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
* d/ G- T) X: e6 y
* h+ H  O) F( _7 n    请高手指点一下。
/ ]3 O* M% U! }  t* t, _
1 E' l* T+ l& x( @/ C  w    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 7 J7 I) C# X: Q# q/ e6 w5 J
#include <string.h>
# T! F# z* l. r/ ?: o2 L#include <errno.h>
2 n- A) \1 Z' l! j- ^#include <unistd.h>
" a! Y2 k3 H* E8 b4 P#include <fcntl.h>
5 `. g6 h% J* A4 a, [#include <linux/kd.h>/ W- k% P& s  {1 E7 M
#include <linux/keyboard.h> 0 G6 m* c$ w9 F3 ]& T& P
#include <termios.h>
  C6 O9 k; o) K' C6 f! c1 ?; F$ e% S( `  R9 V7 W& \% R6 A4 j( s
! v3 s# C) o4 M) c+ R  s& a/ f7 F, [
#define KEY_DOWN 0x100
' q9 r5 Y& j# {  P. `: U9 ^#define KEY_UP 0x000+ o. s# d# X2 Y) o5 A- j

) T- x, s& S1 \int oldmode;
7 D3 b$ \9 l* S: A: {$ b  T. h/ u* O5 E$ o1 G- [
struct termios new;! O6 k5 U/ a9 u9 I& C8 p
struct termios old;4 B3 H+ {4 S$ h; I" Q' g* E
' M* H* D0 Z& ?
int get_key_input(void)
7 O% w/ _' m. U{
9 h. O( ?" e: S  d' k7 U/ V/ tint keyboard;/ R6 ^3 Q+ m0 I% a6 I8 \
int keyboardcode;' t) x5 r9 q* n

3 g3 C0 [" S& s% xkeyboard = init_keyboard();! ?* L. I, M# h8 @8 S8 Y
do{
! s9 S% s8 t  t6 j; x7 S7 Skeyboardcode = poll_keyboard(keyboard);
# u: }) j8 x; n/ Sif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
2 s3 o- S; n+ P" l: Q/ [  X7 ?keyboardcode = keyboardcode & 0xFF;3 i$ \: Q# i( Q0 G* g: K
//
1 Y: g' n+ L8 F- X0 o* H}
  I/ Y, h3 g% B}while( keyboard != 0x58); & N$ Q, i6 {  l' \3 d( l" U. N
exit_keyboard(keyboard);
5 g# L, F8 W# ~8 Q% e8 k6 kreturn 0;, z7 X+ y) Z7 b$ ^" M
}! w& L/ h' [5 q. Y4 o
1 k$ r: m2 p! k/ [" T+ N
int exit_keyboard(int keyboard)% d+ u" D0 i, |1 G" F
{( Z8 S; ~; @( L' T, b  P' l, y
ioctl(keyboard, KDSKBMODE, oldmode);- H# y$ s# T3 U/ Q/ y1 x3 w  u
tcsetattr( keyboard, 0, &old);% l- p. g& r% q6 H. u, e; M
close(keyboard);; [1 B3 D: B' ]
return 0;! d) c0 O  Y7 q8 [
}) x8 K( I) E5 k/ A
int init_keyboard(void)
& r7 l9 Q1 n: S+ Y{
5 L$ l2 l# |0 G# Sint keyboard;
1 \  ?3 b6 ]( s. S
9 `8 L  y# z6 z* }& h, F# u2 n" G+ [keyboard = open("/dev/tty", O_RDONLY);
# _% D+ }  W8 Y. l' H8 aioctl(keyboard, KDGKBMODE, &oldmode);7 O, n5 R5 h6 B, q' j( m6 w
tcgetattr( keyboard, &old);
4 S  z3 P) y; `tcgetattr( keyboard, &new);  _2 ?# R/ T7 \$ T1 d

/ }. W; B) ~  }2 u$ g( tnew.c_lflag &= ~(ICANON | ECHO | ISIG);
) \$ `8 z" B8 a) Qnew.c_iflag = 0;# ^! {% t0 ^! T* R
new.c_cc[VMIN] = 0;( i% h" \3 K* {, M) M% j. [
new.c_cc[VTIME] = 1;: K7 F+ C. c" m6 g! T3 A
# E. |+ b6 d8 `) @2 y! [
tcsetattr(keyboard, TCSAFLUSH, &new);
& [" {$ I6 I" f+ r/ p, Tioctl(keyboard, KDSKBMODE, K_RAW);. }  d. I4 E3 p: r; u6 p
) C7 G+ C' n( K
return keyboard;
; n- p% ]. ?0 ]8 T8 d$ Y' i# N5 Q
}- u( w: U' w* `$ Z8 r
3 g: s, ~4 P% b! `2 R
int poll_keyboard(int keyboard)
# S4 n0 r8 r5 N  R' N& _{
  d* s) B2 h! ?; P: |+ Cunsigned char buf[5];) @# k  f, d- S9 y7 B
int n;: ^: M; `" }: S4 ?8 n9 [
. \& r' s  }6 w) Q0 L0 N* f
int kc = 0;4 w" b" f2 F7 r, d1 w& Z
int i = 0;
; g2 Z! E. a% A! }# ~) ~0 Iint s = 0;' P3 A! _$ X( |/ Y! w5 ]
n = read(keyboard, &buf, sizeof(buf)); 4 y3 w8 k$ Y3 ]- {
while( i < n){
" S  B+ I. @* L( d% f# A' zs = (buf & 0x80) ? 0:1;" n, C: q# b  F6 S( y
s = s << 8;
( d4 r# E: S8 E5 m( bif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){( i! o, m, a% ^: f* y
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
! X9 P1 ]1 q+ K) |1 hi += 3;4 h5 J8 V* H5 ?$ ~& @3 ?- A$ n
}* M' H# B: R( z/ c4 u! l; \) X' D% }
else{$ Z$ J/ N: ?1 H: W) A' i, j
kc = buf & 0x7F;- @3 o& M" O" w% R
i++;
( o0 U( {+ z9 n; p2 ^3 h, w7 G) L}6 [; t" f5 l( U, B$ k4 o
}2 e  H3 N. H- V7 D
kc = s | kc;
; t$ Y% {7 g9 [' b  |$ l6 O5 A4 qreturn kc; 6 a; O1 J! e" o% O0 x* ^0 Q" e
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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