找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19204|回复: 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。" s6 _5 k! n- D# ~* R6 z$ p
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq- S0 ~# B; N/ ?# D; o) K6 [
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。0 }: E: A8 f0 }4 C& j7 x
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,
) s; l. O* ~* G4 f6 L键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
3 m0 F( f) Q& F9 V4 I1 Z3 n1 r另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
4 N( t6 u' {( i; b. n5 b
+ B: l4 S- P" ?$ F) @5 W3 B6 o- `+ w. Y    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
0 M4 n5 K. T" V. h+ b% t    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
0 i. b# ^. T# n- J
+ s: T7 [% w0 S2 H    请高手指点一下。* L* M/ w/ g( x. ^
4 O7 z; p+ r( g
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h> 4 C' R6 w6 z7 b! Z3 u
#include <string.h> ; K3 I* U8 ^: e- l8 D8 r
#include <errno.h> 2 v/ H$ A: `$ K, |& x
#include <unistd.h> : V6 W) D" E5 s/ C/ Y
#include <fcntl.h> ( g+ I$ |. p- B
#include <linux/kd.h>
2 `( H/ w) }. |. o$ c#include <linux/keyboard.h>
9 d: {) n; y: G" s0 O( o7 c1 @8 r#include <termios.h>: R7 o8 s0 k6 F* W- @

1 r' j' t7 j! n
, H3 }" O  B, ?/ j1 y" }% \, {#define KEY_DOWN 0x100
% D6 N& P# e: a+ I#define KEY_UP 0x0005 ]" t7 M: s  s( d% H
1 Z: h: |% Z5 i+ D0 N( D
int oldmode;  ^  E4 `3 K1 T; ^9 w9 f
4 ^6 D' D: f# [8 t
struct termios new;9 w; I% I' ?. u, ~: C5 G. l- y; ~
struct termios old;$ r* P; z9 o2 D# Y
. b% ]& w7 e2 z) t6 l
int get_key_input(void), ^! P/ w7 C1 n  K3 k# `
{
8 P$ H  D  f: R$ `: Tint keyboard;
5 X' G. m2 u  U5 t- i% Mint keyboardcode;$ l5 i$ }  D# c* Z" t

% r1 t; P9 W$ R9 x* d0 N8 mkeyboard = init_keyboard();
- C: ~# l" x. t/ [do{. p; M2 U* Y! j' ]
keyboardcode = poll_keyboard(keyboard);
3 b, N: K& s2 T9 W% |$ F6 i  _if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){ " T, X! c6 f  o9 `
keyboardcode = keyboardcode & 0xFF;
$ L# N# ]- x" {//
* }) [* e0 [* M8 ?" l+ B7 d5 `}
9 E' G8 a  R9 h# K" u6 W$ F  z}while( keyboard != 0x58); ; X% Q- s# r  p. R0 t8 \9 \
exit_keyboard(keyboard);; _' N$ F4 Z9 X; L% O
return 0;2 o$ ^6 v( ^: r. D
}
; r5 b8 N& j: ~' ~$ _* z; O  M) `/ G2 F$ k( n) u7 n
int exit_keyboard(int keyboard)
2 m* I8 W0 A9 ^* q; G" f8 S{
' i8 m3 p6 m, wioctl(keyboard, KDSKBMODE, oldmode);+ H4 h; j8 v& x
tcsetattr( keyboard, 0, &old);
" Y. Q  X  O7 V. K8 U7 G* Aclose(keyboard);  y, ], Z$ a$ M5 L& i
return 0;
% p# b3 T/ X7 m1 i; ?$ B1 F& S}
  d: ^/ Y' X1 [( p' ]) bint init_keyboard(void)
. x  l! i- I, L2 o0 o7 j- H{& Z4 Z! H+ `& [- r5 v
int keyboard;
" w$ |9 Q# U$ o3 {$ ~/ g5 R7 }! r
' a, L& f# J* Okeyboard = open("/dev/tty", O_RDONLY);( U5 e. Q0 g; w; o8 H4 F
ioctl(keyboard, KDGKBMODE, &oldmode);7 P; y& v1 M( e6 N. y
tcgetattr( keyboard, &old);0 a+ [4 B2 i; A0 M
tcgetattr( keyboard, &new);% E6 F3 y1 ]2 ]' ?* K& s& u
; o7 H1 C) u% J! P
new.c_lflag &= ~(ICANON | ECHO | ISIG);
- J& k9 a6 u& v  \( W0 k( znew.c_iflag = 0;9 k6 o# r; Y% E. f  ]# s/ R& o' C
new.c_cc[VMIN] = 0;/ A+ ]+ c$ L) [4 Z$ p- ?3 w, {
new.c_cc[VTIME] = 1;6 Y/ n  A. a9 N+ W, s/ L  z
: `8 _5 Q( R1 d$ l; I! O6 P$ z
tcsetattr(keyboard, TCSAFLUSH, &new);
+ h3 q* H  x6 L1 ?# Tioctl(keyboard, KDSKBMODE, K_RAW);6 C6 r/ g0 E- a) K& k: ], X

3 X# F$ s) c# ^. kreturn keyboard;
" F  ?* G2 e7 Q+ P
; x( |0 D& |6 B. L1 b. L}
. [, m& A0 K, G4 ^0 x- [+ c3 ?$ z% X0 G: Z4 Y( ^
int poll_keyboard(int keyboard)
: W  U2 }2 `6 c7 G, Q{
8 g& S7 f' A- m4 J  U3 F" ounsigned char buf[5];
8 u4 r- _1 R3 v: sint n;
: V& i! C- p& g1 G2 t0 e
' \( K7 z# Y5 z' aint kc = 0;
$ x1 |) U9 y" p& c* j, p% dint i = 0;
  U/ B; P  x% y' K3 B4 tint s = 0;+ ^2 Y" V( u& n
n = read(keyboard, &buf, sizeof(buf));
+ w6 E5 f( r8 q# T9 w# Bwhile( i < n){
, m( ^8 u8 p. P6 u1 `! Es = (buf & 0x80) ? 0:1;
5 B/ K- b" U6 i% L/ W' Rs = s << 8;
% `6 K0 G8 d- F/ @0 N8 pif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
% q4 `$ J8 G  n/ D& n  K4 N; P8 P0 Ykc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);
" R$ X8 w8 L! x, di += 3;
. [0 ?' Y+ J6 [9 [. s}! ?. q# s& U2 a) `5 W- c* \
else{  t$ a  w2 P, J9 j
kc = buf & 0x7F;0 Y! _$ r# i9 J; z
i++;
* ~$ i& h) H5 j' v9 n, s}, {7 T8 f, I! ^+ u6 ]; l7 E
}
0 J$ {) B; T3 Y* ?8 J1 T# b! Qkc = s | kc;- Z/ G, o$ i* F' x2 v8 \0 B
return kc;
& r7 [! Y, ~  c7 u& z}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 10:26 , Processed in 0.032764 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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