]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/keyboard.c
more reliable keyboard injection
[netwatch.git] / aseg / keyboard.c
1 #include "keyboard.h"
2 #include <output.h>
3
4 static unsigned char kbd_inj_buffer[128];
5 static int kbd_inj_start = 0;
6 static int kbd_inj_end = 0;
7 int kbd_mode = 1;
8
9 static const char scancodes2[][8] = {
10         ['a'] = "\x1c\xf0\x1c",
11         ['b'] = "\x32\xf0\x32",
12         ['c'] = "\x21\xf0\x21",
13         ['d'] = "\x23\xf0\x23",
14         ['e'] = "\x24\xf0\x24",
15         ['f'] = "\x2b\xf0\x2b",
16         ['g'] = "\x34\xf0\x34",
17         ['h'] = "\x33\xf0\x33",
18         ['i'] = "\x43\xf0\x43",
19         ['j'] = "\x3b\xf0\x3b",
20         ['k'] = "\x42\xf0\x42",
21         ['l'] = "\x4b\xf0\x4b",
22         ['m'] = "\x3a\xf0\x3a",
23         ['n'] = "\x31\xf0\x31",
24         ['o'] = "\x44\xf0\x44",
25         ['p'] = "\x4d\xf0\x4d",
26         ['q'] = "\x15\xf0\x15",
27         ['r'] = "\x2d\xf0\x2d",
28         ['s'] = "\x1b\xf0\x1b",
29         ['t'] = "\x2c\xf0\x2c",
30         ['u'] = "\x3c\xf0\x3c",
31         ['v'] = "\x2a\xf0\x2a",
32         ['w'] = "\x1d\xf0\x1d",
33         ['x'] = "\x22\xf0\x22",
34         ['y'] = "\x35\xf0\x35",
35         ['z'] = "\x1a\xf0\x1a",
36         ['A'] = "\x12\x1c\xf0\x1c\xf0\x12",
37         ['B'] = "\x12\x32\xf0\x32\xf0\x12",
38         ['C'] = "\x12\x21\xf0\x21\xf0\x12",
39         ['D'] = "\x12\x23\xf0\x23\xf0\x12",
40         ['E'] = "\x12\x24\xf0\x24\xf0\x12",
41         ['F'] = "\x12\x2b\xf0\x2b\xf0\x12",
42         ['G'] = "\x12\x34\xf0\x34\xf0\x12",
43         ['H'] = "\x12\x33\xf0\x33\xf0\x12",
44         ['I'] = "\x12\x43\xf0\x43\xf0\x12",
45         ['J'] = "\x12\x3b\xf0\x3b\xf0\x12",
46         ['K'] = "\x12\x42\xf0\x42\xf0\x12",
47         ['L'] = "\x12\x4b\xf0\x4b\xf0\x12",
48         ['M'] = "\x12\x3a\xf0\x3a\xf0\x12",
49         ['N'] = "\x12\x31\xf0\x31\xf0\x12",
50         ['O'] = "\x12\x44\xf0\x44\xf0\x12",
51         ['P'] = "\x12\x4d\xf0\x4d\xf0\x12",
52         ['Q'] = "\x12\x15\xf0\x15\xf0\x12",
53         ['R'] = "\x12\x2d\xf0\x2d\xf0\x12",
54         ['S'] = "\x12\x1b\xf0\x1b\xf0\x12",
55         ['T'] = "\x12\x2c\xf0\x2c\xf0\x12",
56         ['U'] = "\x12\x3c\xf0\x3c\xf0\x12",
57         ['V'] = "\x12\x2a\xf0\x2a\xf0\x12",
58         ['W'] = "\x12\x1d\xf0\x1d\xf0\x12",
59         ['X'] = "\x12\x22\xf0\x22\xf0\x12",
60         ['Y'] = "\x12\x35\xf0\x35\xf0\x12",
61         ['Z'] = "\x12\x1a\xf0\x1a\xf0\x12",
62         ['`'] = "\x0e\xf0\x0e",
63         ['~'] = "\x12\x0e\xf0\x0e\xf0\x12",
64         ['1'] = "\x16\xf0\x16",
65         ['!'] = "\x12\x16\xf0\x16\xf0\x12",
66         ['2'] = "\x1e\xf0\x1e",
67         ['@'] = "\x12\x1e\xf0\x1e\xf0\x12",
68         ['3'] = "\x26\xf0\x26",
69         ['#'] = "\x12\x26\xf0\x26\xf0\x12",
70         ['4'] = "\x25\xf0\x25",
71         ['$'] = "\x12\x25\xf0\x25\xf0\x12",
72         ['5'] = "\x2e\xf0\x2e",
73         ['%'] = "\x12\x2e\xf0\x2e\xf0\x12",
74         ['6'] = "\x36\xf0\x36",
75         ['^'] = "\x12\x36\xf0\x36\xf0\x12",
76         ['7'] = "\x3d\xf0\x3d",
77         ['&'] = "\x12\x3d\xf0\x3d\xf0\x12",
78         ['8'] = "\x3e\xf0\x3e",
79         ['*'] = "\x12\x3e\xf0\x3e\xf0\x12",
80         ['9'] = "\x46\xf0\x46",
81         ['('] = "\x12\x46\xf0\x46\xf0\x12",
82         ['0'] = "\x45\xf0\x45",
83         [')'] = "\x12\x45\xf0\x45\xf0\x12",
84         ['-'] = "\x4e\xf0\x4e",
85         ['_'] = "\x12\x4e\xf0\x4e\xf0\x12",
86         ['='] = "\x55\xf0\x55",
87         ['+'] = "\x12\x55\xf0\x55\xf0\x12",
88         ['['] = "\x54\xf0\x54",
89         ['{'] = "\x12\x54\xf0\x54\xf0\x12",
90         [']'] = "\x5b\xf0\x5b",
91         ['}'] = "\x12\x5b\xf0\x5b\xf0\x12",
92         ['\\'] = "\x5d\xf0\x5d",
93         ['|'] = "\x12\x5d\xf0\x5d\xf0\x12",
94         [';'] = "\x4c\xf0\x4c",
95         [':'] = "\x12\x4c\xf0\x4c\xf0\x12",
96         ['\''] = "\x52\xf0\x52",
97         ['"'] = "\x12\x52\xf0\x52\xf0\x12",
98         [','] = "\x41\xf0\x41",
99         ['<'] = "\x12\x41\xf0\x41\xf0\x12",
100         ['.'] = "\x49\xf0\x49",
101         ['>'] = "\x12\x49\xf0\x49\xf0\x12",
102         ['/'] = "\x4a\xf0\x4a",
103         ['?'] = "\x12\x4a\xf0\x4a\xf0\x12",
104         ['\n'] = "\x5a\xf0\x5a",
105         ['\t'] = "\x0d\xf0\x0d",
106         ['\b'] = "\x66\xf0\x66",
107         [' '] = "\x29\xf0\x29"
108 };
109
110 const unsigned char convert_table[] = {
111         0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
112         0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
113         0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
114         0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
115         0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
116         0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
117         0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
118         0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
119         0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
120         0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
121         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
122         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
123         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
124         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
125         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
126         0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
127 };
128
129 unsigned char sc_convert_1(unsigned char in)
130 {
131         static int shifted = 0;
132
133         if (shifted)
134         {
135                 shifted = 0;
136                 return convert_table[in] | 0x80;
137         }
138
139         if (in == 0xF0)
140         {
141                 shifted = 1;
142                 return 0;
143         } else {
144                 return convert_table[in];
145         } 
146 }
147
148 void kbd_inject_scancode (unsigned char sc)
149 {
150         outputf("Buffering %02x", sc);
151         kbd_inj_buffer[kbd_inj_end] = sc;
152         kbd_inj_end += 1;
153         kbd_inj_end %= sizeof(kbd_inj_buffer);
154 }
155
156 void kbd_inject_key(unsigned char k)
157 {
158         const char * c;
159
160         if (kbd_mode == 1) {
161                 c = scancodes2[k];
162                 if (!c) return;
163                 while (*c) {
164                         char cconv = sc_convert_1(*c);
165                         if (cconv) kbd_inject_scancode(cconv);
166                         c++;
167                 }
168         } else {
169                 c = scancodes2[k];
170                 if (!c) return;
171                 while (*c) {
172                         kbd_inject_scancode(*c);
173                         c++;
174                 }
175         }
176 }
177
178 unsigned char kbd_get_injected_scancode()
179 {
180         unsigned char b;
181
182         if (kbd_inj_end != kbd_inj_start)
183         {
184                 b = kbd_inj_buffer[kbd_inj_start];
185                 kbd_inj_start += 1;
186                 kbd_inj_start %= sizeof(kbd_inj_buffer);
187                 outputf("Injecting %02x", b);
188                 return b;
189         } else {
190                 outputf("Not injecting");
191                 return 0;
192         }
193 }
194
195 int kbd_has_injected_scancode()
196 {
197         if (kbd_inj_end != kbd_inj_start)
198         {
199                 return 1;
200         } else {
201                 return 0;
202         }
203 }
This page took 0.032163 seconds and 4 git commands to generate.