找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19956|回复: 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。5 ~, O+ k2 a* R0 L8 f' B
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
+ T4 a: l, @- A3 o& _4 }7 S8 p9 w5 a6 ?以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

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

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,3 ?  z7 _! X' ]) d  r
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
% V, r( r; U: A. O另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。. }  ~1 e: q6 \1 \1 O1 o
% O% X( `* o, ^0 V4 C6 ~- n
    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
* J# j: r5 j/ P3 ?5 W' {    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。3 h' y2 `0 i  N# \
% k! M4 F" J: {, r, T6 v
    请高手指点一下。
6 B7 P0 K! e- Q; {2 W% {' O; m5 N5 y- q' U; C  n6 ^
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
- m( Z+ v; E/ i( l( o) i: I#include <string.h> ) a! z3 h3 W+ p9 ]0 M
#include <errno.h>
* p; E( ]' {7 q, k#include <unistd.h>
- o$ r3 T( n0 K9 }#include <fcntl.h>
- T5 C4 H. W' E; C( Y#include <linux/kd.h># I/ z% r- y6 o* M, x: [' J7 o4 R
#include <linux/keyboard.h> ' z( C7 [3 G" p7 v
#include <termios.h>
3 Q2 p- r+ }# |+ J1 z; N! k, S
  ?( X$ ], L! t: t7 v, z0 V
#define KEY_DOWN 0x100
: H7 o8 `! d/ M6 x* e# X+ [7 N#define KEY_UP 0x000
  r4 g2 |- {# N& ?
3 Z1 o  f& S6 [% f: Z5 M- |int oldmode;
8 Y' u2 c; L, m2 t% S+ q) V2 W& g) w! ^
struct termios new;
5 i7 d9 u' s3 W2 B+ k/ [. Ustruct termios old;
! R/ O9 y6 T/ d7 N* f8 _" c8 y
int get_key_input(void)7 h" E' h3 H0 Q! k! w- w
{9 \! B' ~. j, t& q& L- P* S( @+ v
int keyboard;
5 ?- h! a8 D% E4 H7 K4 a& N7 uint keyboardcode;* c+ \% Q" w. t& m  ~, W

- a' f& I( a6 D! E9 F# O  J3 ~keyboard = init_keyboard();
1 [! a7 v  t9 ~% y+ J: I# l* Bdo{
: e  G. f; |  @+ `. ]keyboardcode = poll_keyboard(keyboard); : [' G0 `3 w5 J; x) F4 V. ?
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
& ?2 |6 w4 o$ m! _# ^keyboardcode = keyboardcode & 0xFF;
6 \; c3 v! Y& r3 Q3 \+ w//# `& t8 q% ]! m$ v0 f5 ^  R% _
}1 w* @) ^7 t8 s& n3 w4 J
}while( keyboard != 0x58); 1 i( r2 H( I; L! H( o" [- F
exit_keyboard(keyboard);
. I* E; q4 s8 H) {8 j+ V# Qreturn 0;+ A0 l3 ]4 B9 x" v9 J7 ^# @* j
}
* d6 @" F9 x2 A. ~' y4 n5 E; D: ^
int exit_keyboard(int keyboard)
1 A# I0 ]$ C1 m- a/ |# r# p* d0 T{, ?/ R- n$ _  Q- _
ioctl(keyboard, KDSKBMODE, oldmode);/ U- i2 \+ d# Q  n
tcsetattr( keyboard, 0, &old);; e3 {3 g  [. u" U% ?5 |
close(keyboard);; S" D6 e7 Z) V) ^
return 0;& C- \) l+ \+ c/ |# y
}( h5 N3 v! ~; }' a
int init_keyboard(void)1 G2 @5 n+ U! [" s# q$ p8 v
{" B& R$ J% u, d
int keyboard;
* \9 @" U4 m; x6 j
! ]" G1 s# ^( |. Nkeyboard = open("/dev/tty", O_RDONLY);
& b  b' n4 b- d9 Dioctl(keyboard, KDGKBMODE, &oldmode);
3 r- p$ W) c4 J5 d% z# e8 `; vtcgetattr( keyboard, &old);
; \4 g% n% @: R% J, t& P+ ntcgetattr( keyboard, &new);8 f% q7 e' s# J; Z, [0 r) u

5 G1 g% ~4 }4 {+ h, Qnew.c_lflag &= ~(ICANON | ECHO | ISIG);
0 D' B9 ?( x- h7 wnew.c_iflag = 0;. z' s" R5 {* v' P- Z) ~
new.c_cc[VMIN] = 0;
1 ~4 H! B, v/ Y6 L' \  @4 v' _new.c_cc[VTIME] = 1;% Y5 F/ v; M" S- d
+ {$ c' o2 _3 V% b( v0 Z" q- [
tcsetattr(keyboard, TCSAFLUSH, &new);0 M7 |) n  e3 }, l! h3 j) Z
ioctl(keyboard, KDSKBMODE, K_RAW);
, Y3 A# [) Z$ g, h5 h  @. v9 f; d: ]& R6 t6 ^* a6 g
return keyboard;
( ]5 g- d3 y: T# V% i: E
: c5 o/ C' {6 v( M; y% ?}, V. e1 |) W% Q: u
! R4 T* u  p5 Y
int poll_keyboard(int keyboard) ! O4 U1 h# q- E* z* d8 A
{ 4 G& c; a# x7 O: V) d9 J  S9 U
unsigned char buf[5];
: ~) e9 i7 O; c6 E6 fint n;$ V% T+ P" _: V8 Z+ D( I  X, E

7 \4 R2 r+ r/ T5 g! B2 i& |int kc = 0;6 X; i$ |! `# w8 F7 [
int i = 0;5 \) v9 j# s* p4 n: t( e
int s = 0;2 A. g7 p) W( x8 A4 }- W3 v! B
n = read(keyboard, &buf, sizeof(buf)); , L! M4 [0 ?& p6 z9 r  Q0 D% `
while( i < n){
8 Q. h- v. q8 b& B# m* B! E! Ps = (buf & 0x80) ? 0:1;" I, ?  S% _& C& T1 Q7 m6 W9 P
s = s << 8;
. s3 z$ V7 `1 P6 U4 kif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
; u  _' [) I3 d: F2 Mkc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);- J0 X$ r- K& a4 r. k9 ~$ G- m% M, O. E
i += 3;% t: ~5 n% H6 k$ y7 L$ ~) H7 h- E5 L
}
2 C; o* Q4 E9 w$ U& Qelse{
7 }! J8 x' j7 p- w. t4 bkc = buf & 0x7F;
2 \: i, Z  z& t& }i++;
. ?, i  w; Y, O: R% x( A}
; |1 y- I: O+ c1 n3 F; n}6 j. p/ ]  j6 X! U
kc = s | kc;
4 i, A& B. f, h* Preturn kc;
' S/ r. c" \, S1 G1 I* s7 @}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 16:01 , Processed in 0.749966 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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