找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20119|回复: 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。" [1 n- u. F/ N5 o' z1 C  C  ?8 v* T
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
  M$ `) T! L" k( z以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。- q4 w$ u; H; T4 P: |3 {3 I& ?
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
( M5 k, J9 k, }7 F键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
* P3 a6 V( ]- P  ~1 o  w4 q$ y另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
+ @" I: u( p% `9 |( e3 ?5 L" g* A$ ]! a  Z) r) I
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
# u- d; i& G0 B# Y* n: V3 V9 D    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。8 _$ d: y& \' ~, b& G# E# g

$ M- _1 s' Q3 E    请高手指点一下。) h3 Y7 h, C+ C0 y* f+ ^

" Y5 P9 n* ?* h6 X( E! b) h( q    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
0 X7 G: R7 A; {/ [9 q6 X#include <string.h> 1 ^. s$ ?& B  a2 G
#include <errno.h> * n2 b; N5 I( Z3 I
#include <unistd.h>
" Q$ a0 ]: Z2 a6 n0 q" L  T% F#include <fcntl.h>
- y, I  C1 e. X' N#include <linux/kd.h>9 k+ n& [% r% |/ {
#include <linux/keyboard.h>
0 R/ ]% l6 r0 Q' \  M#include <termios.h>2 @7 T% u% X5 @( W
1 i' u- V* Z+ X  G, y

/ p$ ]7 c; I0 E8 z#define KEY_DOWN 0x100
4 j1 X) k# ^. H+ e) B, H#define KEY_UP 0x0003 i+ A2 G0 k) ^* C8 `( Y6 ]

# t$ B1 J' k* u  B4 Pint oldmode;1 {7 G$ n' |7 l9 T) x
3 v4 G) s: `" t2 ]
struct termios new;
+ W9 q3 J% i. R/ h) H# @7 {struct termios old;$ ]' @9 N+ J0 L

+ B- c, e5 x+ U0 B( J# fint get_key_input(void)
% V7 |- @2 t6 S{
* m  ~' G4 S4 |  Oint keyboard;
  R. Q  a, o, i, Fint keyboardcode;
% w# h. M/ f" [6 J& q/ c3 X! F9 x- ^* t2 K: g7 D
keyboard = init_keyboard();
8 j9 }. \7 ?3 j" S1 C. D! o% L! T9 Fdo{0 q) j8 V- P- M) E4 I" ?! f
keyboardcode = poll_keyboard(keyboard); 1 I& n2 X- i& @9 t0 p
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 9 T: H+ [) q! q' Y9 q3 q
keyboardcode = keyboardcode & 0xFF;
5 T  b5 v! u4 M) K//, G' |+ }+ I/ ]5 ~* D2 w: V
}2 h7 f& R! C& L- i
}while( keyboard != 0x58);
# Z+ C7 C7 @5 o9 texit_keyboard(keyboard);' C$ H% f6 e' Q) x/ N
return 0;
6 S& l1 B7 `1 |" a* B, `2 X5 h}/ s7 W2 q, Q$ \  y' U$ z5 i8 E

6 V8 c, A( d, h6 iint exit_keyboard(int keyboard)( {+ i9 e5 z1 ?! g' l
{  K  N, q9 B1 [8 n! E( A" M
ioctl(keyboard, KDSKBMODE, oldmode);
5 _% {+ v* k1 ktcsetattr( keyboard, 0, &old);& C2 _2 e( p; ]7 ~. _8 `
close(keyboard);% Y8 _0 A4 ^4 f- f. i
return 0;/ n; h! G3 l" k- W  G! J9 Q
}
" }5 ~+ c, H% e' \int init_keyboard(void)* V" d+ b+ f6 e+ Y5 t% r6 {
{" j8 e8 n( F6 k; N
int keyboard;& R( }( b7 X- p3 K

7 o+ l( w" U& t; e5 s8 @keyboard = open("/dev/tty", O_RDONLY);
) z7 J# C* x/ ^. ^0 w) L# r  \+ {ioctl(keyboard, KDGKBMODE, &oldmode);. e; N/ l$ S9 C0 H
tcgetattr( keyboard, &old);
. l/ e; i/ x( u, r& G  ^, O1 qtcgetattr( keyboard, &new);
( J3 E+ [+ P. {4 K7 G
- ?* d; a! m& A3 s$ e; A0 D% W( \new.c_lflag &= ~(ICANON | ECHO | ISIG);
& O7 ?8 z3 Z5 h) I" s" n, Tnew.c_iflag = 0;; Z0 ^: m. [5 g/ z2 \7 k& x, J) c- [7 K
new.c_cc[VMIN] = 0;
* c0 L' j& e/ G7 o0 m, o  Fnew.c_cc[VTIME] = 1;6 C1 n7 w; c, U# G
  c" \$ g/ J0 J& l) D, s
tcsetattr(keyboard, TCSAFLUSH, &new);5 T3 z/ n) E& [* }) @( Z1 m
ioctl(keyboard, KDSKBMODE, K_RAW);& Q- p9 o, O' q% U* n3 Z

% K4 l! W9 d- Lreturn keyboard;/ C4 u9 [- s; D/ c3 d' Y

1 G9 A; m, t3 I- ^$ z! A# ?9 j6 P$ i}8 {$ r# N7 m; |

! g0 X# V0 `7 r; G1 y! nint poll_keyboard(int keyboard) ) D+ W$ W9 S9 ]2 X
{
; Q: ~6 v, B( v+ Q2 {unsigned char buf[5];. c6 J" k3 o+ Q$ ~
int n;; B! p* Q7 _( I+ w
9 p% w7 e! _5 ?. K
int kc = 0;- W. }- B( E# Q+ J
int i = 0;9 b+ S0 `( ]' H' l0 L: a: U
int s = 0;/ z& Y) ~7 N( P. g
n = read(keyboard, &buf, sizeof(buf));
$ C0 z0 G" X: i* ^, Q' m; W2 Cwhile( i < n){# P+ b3 v3 x3 G; c
s = (buf & 0x80) ? 0:1;9 g9 S, {6 N* p) U2 y* c
s = s << 8;
; P" `0 F2 K* t. Xif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){/ }" `9 u/ d7 p+ r# n: P6 |0 b
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
+ X, Z* L  F( G+ W  q$ Ki += 3;
. c$ t# N# W9 ?# V}
) U9 J$ y( h/ c5 M2 L- k# l# Nelse{  _5 m8 ~4 q6 V- p1 W
kc = buf & 0x7F;5 [5 x' X& y" v( `9 X5 Q' O' [* b
i++;
* f/ Q, O: v% s) p}& D3 J7 w6 `3 O7 C/ _
}" N9 o9 W' F* `7 X  m2 I& W
kc = s | kc;! x6 S( h* N' J
return kc; 8 I/ c' `, m% U4 t. {# `  L
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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