找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20198|回复: 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。$ a  \5 l& z4 _1 E' ^6 |- K/ X
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq. X3 H2 c) l- j7 ]! |
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。% v. J& |' @  q/ p. \2 O  j: X
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
" F, @) v5 J$ U* x- C- ~键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
+ x& ^. W4 R5 }- X7 p另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
- g4 X' q! m4 Y+ E. q3 o; R' o+ s" ^7 P, z
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
7 o; n' y/ a$ e% O    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。# W7 e( c  c: F) E" z$ |  j
- s$ `) Q- b1 J) k; f/ f0 H
    请高手指点一下。: [, l, _* @; s* a7 P
/ q! o3 w; t( u/ B
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
7 d" U9 H$ y9 H8 ?( O/ @#include <string.h> % \- T' M% ^; K0 ]* U! d
#include <errno.h>
+ V- O- ]+ K4 Y' @#include <unistd.h>
7 Y" j3 T. J2 |0 Y$ k#include <fcntl.h> - P  J! H+ I4 @8 C+ f
#include <linux/kd.h>% K+ I) T6 j. Z8 g, P* Q
#include <linux/keyboard.h> ) H. t5 }3 e) ^8 q
#include <termios.h>
# t7 O" r/ E8 `5 y9 p# I/ P4 R% D2 \, e& O
+ J2 Y# S2 Q  Z) B- i' B" p
#define KEY_DOWN 0x1007 v6 v. k% n" E: S& A, D- H8 G
#define KEY_UP 0x000
% w6 u# i1 f3 V! x/ n& x- M# V- s0 Q- K( G' R
int oldmode;
1 x$ M" ^7 H. L+ i
4 a$ F+ i& `: y5 E( h% Nstruct termios new;4 V2 ^) n" }% ]
struct termios old;& c. h( p! {/ K0 ^+ l! ?
, L3 `8 |" ?; D! ~, q' d
int get_key_input(void)7 h; p& F- B4 T- t2 u
{4 S* p8 x; E2 T5 m3 @3 R
int keyboard;
8 [# z) S3 F# P% i0 Q2 Qint keyboardcode;
6 o1 D- o3 j/ Z, W3 @) v! s3 P2 R# ?( {, N
keyboard = init_keyboard();
2 _7 L8 g# C" ^2 i+ Q4 K2 V/ W2 Z6 ]" rdo{# C# _% a& ~& Q: n2 {! j8 b
keyboardcode = poll_keyboard(keyboard); ) |8 X# R6 g: l: B& P4 R
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ 0 ?* ^! k/ {+ F4 d9 }- r0 P5 E
keyboardcode = keyboardcode & 0xFF;: _$ r8 H6 m" P7 q
//
( O2 k2 {* ?& v$ v9 ]' J}+ b% X( X7 r( {
}while( keyboard != 0x58);
2 u7 P) X4 j$ B, m' e8 A4 x! _exit_keyboard(keyboard);
+ U8 T$ l4 `; ?/ Greturn 0;
% @9 R2 B$ l; j9 R* h3 O, z}% m9 G# S7 D. C. i2 q$ L5 a
' S! l  U, P0 A3 F# T8 t$ o5 g& ?% x
int exit_keyboard(int keyboard): u0 o) n! v/ `$ W( r+ q9 N& G) R$ Z
{
$ Z! g: ~( }0 D8 O/ Pioctl(keyboard, KDSKBMODE, oldmode);
  Q  s7 k( K$ Ptcsetattr( keyboard, 0, &old);
, @- r3 ?( O  p7 G% W0 Nclose(keyboard);* m6 D5 G" K$ g8 U2 |* g. _* Y, X
return 0;
. I. a1 `' o4 T  w+ e}
9 M1 d  w6 H% x/ F5 Tint init_keyboard(void)( y* p) f5 }% F" p  H1 Y
{, \8 N! ~7 a4 Q3 E: v
int keyboard;  {3 d9 \6 ~7 Z5 U: Y, W: c
# x, Q# t) [# Q; R% R4 B% s
keyboard = open("/dev/tty", O_RDONLY);+ l8 n4 o- ]' `+ |  U% }9 d# k
ioctl(keyboard, KDGKBMODE, &oldmode);' U- P$ `% X* w) M' b% o. ^
tcgetattr( keyboard, &old);& _' w9 z* F- f6 m
tcgetattr( keyboard, &new);
& t3 q  J; b! F( i- ?9 T
  Z; Y  |6 a* \! v$ Knew.c_lflag &= ~(ICANON | ECHO | ISIG); 6 z, x4 i: v/ E  j& w. V
new.c_iflag = 0;. s, k% E  u9 Y3 X6 J6 Y' f/ p
new.c_cc[VMIN] = 0;
8 Y4 [* @' {& ?new.c_cc[VTIME] = 1;5 [1 L& R5 H2 F/ L. D5 s% r

* G" l: {7 k, _& w1 o/ ]tcsetattr(keyboard, TCSAFLUSH, &new);
3 f  M# V8 {! o. ]( Z1 L# qioctl(keyboard, KDSKBMODE, K_RAW);6 Q; l/ \1 R1 L# U0 X: w
5 y- r: G0 P% L2 e  K7 v& Z
return keyboard;
1 D* @2 W: {9 Z; g, e; A; D% E0 c% z6 s7 Q
}/ Z) j( {5 m5 H, [

; ~6 L. O2 a/ ^- Vint poll_keyboard(int keyboard) 4 ]' o) A+ [$ ?  `  _0 i0 [; ^# f
{ 0 I5 S5 \' G8 a- D
unsigned char buf[5];$ Q& X8 g; I6 _+ @* s* Y
int n;
1 |' A, }# |' \* d, O  m9 j0 ]" s: R  H6 c. F* q
int kc = 0;
( J7 R4 f) Y- L2 Bint i = 0;6 K: G1 A* a+ e6 k: e4 s* H& i
int s = 0;
8 d$ v3 R7 B9 t% z% qn = read(keyboard, &buf, sizeof(buf)); : ^+ s' l  y) r4 k$ ?' _
while( i < n){4 q  j* E) g  z# o) W- `
s = (buf & 0x80) ? 0:1;
. ^: o2 ~# M7 c6 L( Ys = s << 8;2 M( E  t0 i3 \$ f
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){/ l3 \4 L7 z# \0 y4 d
kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
8 x! M4 h8 _3 o! I; Y3 |. @i += 3;
, H  W) ?4 N" e* z6 @7 W}( b; k) H' f8 r4 b9 g6 q
else{' C4 j% D8 P7 q' w9 r7 Y
kc = buf & 0x7F;# _1 y/ x" r- ^" z% r) e3 F; ~
i++;
4 ?# P4 u3 X: N- h6 K6 Y}$ O, v2 u6 x9 I) ]9 u6 U
}
9 d# T$ p5 c6 H  P+ [4 W6 x* z' ckc = s | kc;, ]- F3 D' P" H$ H, ?) @
return kc; 7 W2 I5 G" J! C1 ]( W* ^5 J# S
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 21:02 , Processed in 0.091300 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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