找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 20197|回复: 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。
8 X4 z' {  S0 l' vKeyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
0 i: e- i9 B% P( H以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。: a2 T+ z3 L2 W, G( x
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,0 r* C, I; e. M% R
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,- Y  e6 z% |7 b
另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
; s* k: ?) j9 S9 D  B: N. O- T+ m" i+ p
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。% R0 o6 Q( k* X2 M3 T$ ?4 B# Z8 m$ m
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
6 c- t8 o% \* `. ~0 X7 R2 v* Y2 b/ a- T4 [
    请高手指点一下。
# S% ]7 p# h& L! Z- n& C5 v% A7 Z" c, D( h! J, I
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 5 x$ ~  p4 K5 |! B" }1 {1 {6 @
#include <string.h>
: c. O! p9 K/ b' U' W4 g- @#include <errno.h>
0 U3 X$ K! R7 ~. e& h! {" K#include <unistd.h> 9 W# ~4 h) q7 `9 ~& ?5 m1 B
#include <fcntl.h> ! K+ T# G, J: |2 [5 O& p; }# X
#include <linux/kd.h>
0 s2 c7 `" F: R3 c#include <linux/keyboard.h> # X0 z8 f* N- W) b) ~8 u) `% ?! D
#include <termios.h>
: {. |( a7 i/ m" @$ o4 p- I* _  [  f+ W( p# N  j5 H  `
1 I! J/ L6 Z7 ?/ l/ n( S  w( D
#define KEY_DOWN 0x1006 v( e5 A5 j5 {4 H8 W
#define KEY_UP 0x0003 X  j9 L( r7 x' A  |7 f
. M7 L1 W/ @& m  z" O: j* K2 @! y
int oldmode;
: j1 w' P. G5 c( r! W! p; {5 j. j5 F/ }1 g0 e+ B9 a1 R+ m
struct termios new;/ I' r" s: o1 ?# j  [
struct termios old;- z+ F) y/ C6 C1 `
" R7 J9 J1 ^- h6 h( f: ~1 n* Q8 Z4 H
int get_key_input(void)
& }: o  h  G7 M& h2 O* S+ v{: V" a% ~/ N+ H1 I  G, O
int keyboard;5 D0 i# Z$ l% z- u6 P
int keyboardcode;& [% ]7 U6 _- j' b
8 _- z" H& g& H* f; z; d9 \. \
keyboard = init_keyboard();
, I8 i8 U& ^3 I/ i* q& v# u3 d% wdo{: q- p% h; o1 \4 D% |6 m) y1 M7 D$ ^
keyboardcode = poll_keyboard(keyboard); . q$ a/ s" q0 t% m& U. I$ b% G
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
) q5 B- G( O. F$ q0 n  _8 N( _7 Skeyboardcode = keyboardcode & 0xFF;
" r6 B8 @7 u7 n- \3 H- M//
# h: \9 V- c7 e}
- {4 ^. ?$ P3 c2 g2 Q) ~/ [2 `! I}while( keyboard != 0x58);
& {# y6 s- {5 }* s1 M4 u5 Zexit_keyboard(keyboard);
' e. O! W2 f8 [0 g" }3 \" D* areturn 0;0 a, x( A6 C+ Q2 x
}
% v# x5 B% J' o  f* q
/ ^2 o/ d' S4 U& w8 c4 d8 }; G# zint exit_keyboard(int keyboard)
" J/ R. I; n# i9 W- Q# h- _  q{& [$ j6 v: T  ?9 v
ioctl(keyboard, KDSKBMODE, oldmode);5 N! v2 Z5 A) {; {; C% [! w$ t. F
tcsetattr( keyboard, 0, &old);. T) S, j( S/ ^  g1 `4 j
close(keyboard);2 b, }4 \6 ?9 K5 u1 U
return 0;* a) O! S; E; Z) T; p" R; K
}
+ s6 u, n4 ?& X' J: p# Vint init_keyboard(void): n. j" \! Q3 i: U; [5 m" Q2 D
{4 Q/ h$ ]' Q. U0 h; _; D
int keyboard;0 q" [- [) T6 }: V1 T, O% P/ k
- k1 @; d8 `5 x: @% m% M5 G' f
keyboard = open("/dev/tty", O_RDONLY);/ r" M0 I  J  L+ u) L
ioctl(keyboard, KDGKBMODE, &oldmode);$ w+ k/ V* P- \+ X! I% ]
tcgetattr( keyboard, &old);, ^" s5 Z. ?! G: w# a- J4 x
tcgetattr( keyboard, &new);4 S8 J. K# q+ b
2 J9 R- l- x; d
new.c_lflag &= ~(ICANON | ECHO | ISIG);
$ x/ H! r5 ~6 c( K1 ^6 snew.c_iflag = 0;
! ?. W  S# j9 c) p8 Jnew.c_cc[VMIN] = 0;, M6 p3 k% f8 V- v
new.c_cc[VTIME] = 1;8 c8 B7 {0 T$ U! j  g6 p3 V

: b8 P+ R8 a, y8 ^tcsetattr(keyboard, TCSAFLUSH, &new);
6 j+ k, m0 T% K' V7 l$ R! ^ioctl(keyboard, KDSKBMODE, K_RAW);$ O% e# z% E* h6 K, b* M
+ G0 U) O6 H3 Y4 X% j( A  P8 n
return keyboard;
7 [+ M# R1 _; u, {" S
3 Y' m, U5 }% q! m  A) Z}7 I6 i# S* [8 j" V6 B! N' m
( h; _( h' k6 u  H1 b  Y. U
int poll_keyboard(int keyboard) ! v$ ^$ o" [: p) ^/ K6 d
{ 7 O, g3 {- x7 @9 J1 [& u) U
unsigned char buf[5];
% @5 j( O4 e, [5 wint n;
( `+ y; E' l2 S) u8 Y3 H# C% q. n  ]
int kc = 0;
4 T) P# B# y6 H' [* O2 D3 w# Nint i = 0;' N  I  K$ {* d+ `" m" r0 m
int s = 0;
9 T7 ?9 P* t5 n) X# _; in = read(keyboard, &buf, sizeof(buf));
$ [" K3 _2 [5 dwhile( i < n){0 ?7 [# h$ S" g% Z6 f2 U
s = (buf & 0x80) ? 0:1;
& n' _2 M( ]  F( g& b' Js = s << 8;; d+ _' @4 c9 a+ V: R
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
# r; s" O6 }) W' q7 Ekc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);7 `% V/ [( v* J- |
i += 3;
% w- |' _+ g8 v}
! Y0 p1 M1 ], {else{
  D: g2 s2 j  }kc = buf & 0x7F;
- j7 ?3 b, ?$ N' V# q8 ai++;
+ g# ^  f5 [3 E}
$ C- {: N: G2 b  _}+ K8 e" R3 Z. F# r
kc = s | kc;/ p7 F  X: d1 E+ k
return kc; # Q1 n7 b- @$ o3 B/ `" {
}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:53 , Processed in 0.056873 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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