找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19840|回复: 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。) h/ Q7 N5 Y! _0 Y7 v
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq  @  Z, P6 O4 Y6 y+ \, V
以后就会收到scancode了。
回复

使用道具 举报

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

回复 2# peterhu 的帖子

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

使用道具 举报

发表于 2009-7-26 09:40:51 | 显示全部楼层
用键盘勾子就只可以了,在AP层就可以完成。
3 s% {' a) w6 z) o" ^也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复

使用道具 举报

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

回复 4# winbondowen 的帖子

THS,1 S2 t) A2 [5 @! u
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程
回复

使用道具 举报

发表于 2009-7-27 16:23:23 | 显示全部楼层
你可以挂windbg去追这部分的流程,
, _+ N8 [/ O$ }$ I! ~" s3 y另外<<windows核心编程>>也有讲解。
回复

使用道具 举报

发表于 2009-7-27 18:30:05 | 显示全部楼层
最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。9 I) V6 M: z$ i* J2 o

- L# ^% V1 i& [; o    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
( @' z1 u: Q! D* T, L    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
) R& F3 C3 W: Y0 q
$ j$ s7 H# R+ i  D    请高手指点一下。7 }1 O  _+ W1 q( S+ |6 ]
( S2 B8 Q5 v0 y* g
    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?
回复

使用道具 举报

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

使用道具 举报

发表于 2009-9-1 16:31:15 | 显示全部楼层
#include <stdio.h>
2 Z( I" m6 K% v3 ~4 P3 T#include <string.h>
3 O& v( G& {6 y: j#include <errno.h>
) i$ e0 i# U8 Y3 J0 b  Q  {/ X#include <unistd.h> 7 B9 j9 Q2 b# |5 E
#include <fcntl.h> $ W1 C& _6 o, ]& w5 ?+ m
#include <linux/kd.h>
' H# r( y3 R; ~  H#include <linux/keyboard.h>
) v! C0 @+ L/ q  ~0 S5 i1 M#include <termios.h>
$ f) d5 b# p& }9 T% [/ y- ~
; H1 e% a- U3 N
- n: u# u2 {$ h( m$ o2 Z& g#define KEY_DOWN 0x100+ U: d4 P% v6 _  I! \7 Q
#define KEY_UP 0x000, D9 U1 i# B7 V& ?! p+ ?

. d4 i. x6 v& l/ A  Aint oldmode;
) h# x. ~* n& j& M( W2 |+ ]5 @! s( l, S- [
struct termios new;3 J( f% u9 v# C5 Z9 L
struct termios old;: o' ?( t" K- `/ e( O

8 z7 o. [" z1 i! g) Nint get_key_input(void)# s7 Y9 z" y& X) e3 @
{8 |; X. a, H$ i
int keyboard;
( ?& R1 \- |$ D: ?0 o, \" wint keyboardcode;
' ]. G& b3 L, z5 R. C
/ P) W* u6 B* ?keyboard = init_keyboard();# u0 @& c6 L9 y- O% d! B3 v% {
do{1 R8 Q) \: N: v+ Q, F% c
keyboardcode = poll_keyboard(keyboard);
/ X% t) e  b! P. ]% gif((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
$ N6 v( L, h! t; {4 H# Bkeyboardcode = keyboardcode & 0xFF;
& V3 ~/ B. P  D5 c: t, d//. b$ {) F& F5 }$ J
}) E) \: h- L; v' A
}while( keyboard != 0x58); , Y: w. E. `8 D$ o
exit_keyboard(keyboard);
9 O6 A1 h4 r3 r& Q4 l4 M2 P4 z) H+ hreturn 0;2 V  ~* S% G5 [& a! A) @8 g
}
1 g5 o0 J7 O9 w
- x1 k/ H% f5 e8 ]6 O( v4 Gint exit_keyboard(int keyboard)7 z; O8 ]9 ]8 ^& y. {
{
- n, m  u3 B1 H7 G( C4 Y, e9 Kioctl(keyboard, KDSKBMODE, oldmode);
0 a1 e  V+ A& Y; L6 s( C4 ?4 Otcsetattr( keyboard, 0, &old);7 \, E- \9 B$ Z- N" H6 p: B
close(keyboard);
; D1 S4 b& z4 ]2 v" ?/ p& o4 Sreturn 0;* O5 ^9 y# u7 Z7 l- ^0 c3 k- H' V6 v
}# g, g! z5 b- Z% h4 }, Q; t. Z- G, g3 }5 p
int init_keyboard(void)# \* }& V1 o+ R
{
8 e) k0 g# g! F! ^int keyboard;
* T. l& I0 |8 [$ V0 y" o4 _! x+ `; ?2 s
keyboard = open("/dev/tty", O_RDONLY);! L$ d6 `0 D' t  ^9 B6 P- a  ~
ioctl(keyboard, KDGKBMODE, &oldmode);& H6 r8 M6 W; V6 [. L4 F" b
tcgetattr( keyboard, &old);
9 I( b. E6 k0 J) l1 ~tcgetattr( keyboard, &new);: e  t, C, B& r- n( g

0 T6 T1 h: O- }! xnew.c_lflag &= ~(ICANON | ECHO | ISIG);
" M" p5 D5 z. ]new.c_iflag = 0;; \3 `/ q- _. n7 x( J
new.c_cc[VMIN] = 0;
) I( j- N0 B! X, i$ m# fnew.c_cc[VTIME] = 1;( u5 q; w# @& i( q7 m7 x# r7 w

) t8 O4 I) z0 t1 E! Y0 V6 o9 jtcsetattr(keyboard, TCSAFLUSH, &new);& u/ ~- x2 D6 }9 Q) i0 q. y9 \
ioctl(keyboard, KDSKBMODE, K_RAW);
; q  a( i: X+ n7 v& {. x; K
6 k! [+ j: ^* h2 u+ y& L5 wreturn keyboard;- q: P# P9 W9 {1 z- G

& G) I+ T( n' z5 H8 G8 p! w( Q3 b}2 o! m4 q: |1 G. P9 x

$ \  M* W7 n0 j6 I) k. nint poll_keyboard(int keyboard) 6 R8 _7 F& q) z* t$ D9 q; Y
{ 3 L4 w+ ?' f/ N( b
unsigned char buf[5];& v* R) [0 r- e/ M1 d  d
int n;
% t3 o5 y+ _5 F0 T
4 d3 P5 Z- q- H) ~3 o. `3 ^' b- N' Cint kc = 0;, Z: g# ^  z; T$ Z" i8 y
int i = 0;7 v: v9 B6 }; R, Z% J, |8 c
int s = 0;
, }8 o$ @8 Q* s& D1 E- {n = read(keyboard, &buf, sizeof(buf)); ! Z! f; A, V" j0 [$ c9 F
while( i < n){1 h2 h+ }- C. G
s = (buf & 0x80) ? 0:1;
0 E, J# C/ v: D  r  u2 i' m) Zs = s << 8;
% F+ t3 R. r& K: I6 `8 q  z$ H6 xif((i + 2) < n && (buf & 0x7F) == 0 && ( buf[i+1] & 0x80) != 0 && (buf[i+2] & 0x80) != 0){
0 u9 u. A& ]# Y! Z5 g' L$ L- |kc = ((buf[i+1] & 0x7F ) << 7 ) |(buf[i+2] & 0x7F);  p- |% z: U1 o1 O* J! D1 v# y
i += 3;
: k1 W: D. |5 R0 }* m2 L  Q! U! j8 L  R}, T9 f+ D5 V% W6 t5 @
else{
% }, x  Q4 B, a; E+ Kkc = buf & 0x7F;" G- \- M. T. R
i++;$ o; n; Y4 K7 w/ V$ y0 r5 r9 y6 T* _
}
$ u( W. e: ^) |% Y}
, `1 t; j( {0 ~2 U& B" okc = s | kc;& ^0 b7 C1 w% o6 `1 ]3 o6 [  [) b
return kc;
* @4 A4 J, l5 i& d' d# L% ?! ^}
回复

使用道具 举报

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

好长的code啊

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 05:36 , Processed in 0.098526 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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