zhaolw 发表于 2009-7-24 11:11:14

WINDOWS OS如何获得的SCAN CODE

如题,这个问题一直困惑着我,是INT 16从键盘BUFFER取的吗?还有,是谁通知WINDOWS,让WINDOWS去取SCAN CODE?我是菜鸟,希望各们给予解惑!

peterhu 发表于 2009-7-24 11:54:29

Windows下是通过keyboard Driver获取键盘输入的,而不是INT16。
Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
以后就会收到scancode了。

zhaolw 发表于 2009-7-24 12:03:00

回复 2# peterhu 的帖子

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

winbondowen 发表于 2009-7-26 09:40:51

用键盘勾子就只可以了,在AP层就可以完成。
也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。

zhaolw 发表于 2009-7-27 12:58:06

回复 4# winbondowen 的帖子

THS,
键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程

peterhu 发表于 2009-7-27 16:23:23

你可以挂windbg去追这部分的流程,
另外<<windows核心编程>>也有讲解。

bothsky1 发表于 2009-7-27 18:30:05

最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。

    在edit下面,如果没有按键,是不会主动跑int16来等待按键。   只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
    不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。

    请高手指点一下。

    顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么?

mary19831122 发表于 2009-8-20 22:24:13

顺便请教键盘中断程序怎么写?

Alexander 发表于 2009-9-1 16:31:15

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <linux/keyboard.h>
#include <termios.h>


#define KEY_DOWN 0x100
#define KEY_UP 0x000

int oldmode;

struct termios new;
struct termios old;

int get_key_input(void)
{
int keyboard;
int keyboardcode;

keyboard = init_keyboard();
do{
keyboardcode = poll_keyboard(keyboard);
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
keyboardcode = keyboardcode & 0xFF;
//
}
}while( keyboard != 0x58);
exit_keyboard(keyboard);
return 0;
}

int exit_keyboard(int keyboard)
{
ioctl(keyboard, KDSKBMODE, oldmode);
tcsetattr( keyboard, 0, &old);
close(keyboard);
return 0;
}
int init_keyboard(void)
{
int keyboard;

keyboard = open("/dev/tty", O_RDONLY);
ioctl(keyboard, KDGKBMODE, &oldmode);
tcgetattr( keyboard, &old);
tcgetattr( keyboard, &new);

new.c_lflag &= ~(ICANON | ECHO | ISIG);
new.c_iflag = 0;
new.c_cc = 0;
new.c_cc = 1;

tcsetattr(keyboard, TCSAFLUSH, &new);
ioctl(keyboard, KDSKBMODE, K_RAW);

return keyboard;

}

int poll_keyboard(int keyboard)
{
unsigned char buf;
int n;

int kc = 0;
int i = 0;
int s = 0;
n = read(keyboard, &buf, sizeof(buf));
while( i < n){
s = (buf & 0x80) ? 0:1;
s = s << 8;
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf & 0x80) != 0 && (buf & 0x80) != 0){
kc = ((buf & 0x7F ) << 7 ) |(buf & 0x7F);
i += 3;
}
else{
kc = buf & 0x7F;
i++;
}
}
kc = s | kc;
return kc;
}

(__XXK__) 发表于 2009-9-2 23:51:33

好长的code啊

好长的code啊,能否概括一下
页: [1]
查看完整版本: WINDOWS OS如何获得的SCAN CODE