-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathkb-led.spf
More file actions
66 lines (53 loc) · 1.74 KB
/
kb-led.spf
File metadata and controls
66 lines (53 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
MODULE: KeyBoardLed
WINAPI: DefineDosDeviceA kernel32.dll
WINAPI: DeviceIoControl kernel32.dll
0x40000000 CONSTANT GENERIC_WRITE
\ 3 CONSTANT OPEN_EXISTING
\ -1 CONSTANT INVALID_HANDLE_VALUE
1 CONSTANT DDD_RAW_TARGET_PATH
0x000B0008 CONSTANT IOCTL_KEYBOARD_SET_INDICATORS
0x000B0040 CONSTANT IOCTL_KEYBOARD_QUERY_INDICATORS
: KbdPs2DeviceOpen ( -- DeviceHandle )
S" \Device\KeyboardClass0" DROP
S" nnCronKeyboardControl" DROP
DDD_RAW_TARGET_PATH DefineDosDeviceA DROP
0 0 OPEN_EXISTING 0 0 GENERIC_WRITE S" \\.\nnCronKeyboardControl" DROP CreateFileA
;
: KbdPs2LedSetAll ( LedMask DeviceHandle -- IoFlag )
>R \ DeviceHandle
16 LSHIFT SP@ >R \ input buffer, KEYBOARD_INDICATOR_PARAMETERS
0 SP@ 0 SWAP 0 0 4 R> IOCTL_KEYBOARD_SET_INDICATORS R> DeviceIoControl \ 0 - error
>R DROP DROP R>
;
: KbdPs2LedGetAll ( DeviceHandle -- LedMask IoFlag )
>R
0 SP@ >R \ output buffer
0 SP@ 0 SWAP 4 R> 0 0 IOCTL_KEYBOARD_QUERY_INDICATORS R> DeviceIoControl
>R DROP 16 RSHIFT R>
;
EXPORT
4 CONSTANT Caps \ KEYBOARD_CAPS_LOCK_ON
2 CONSTANT Num \ KEYBOARD_NUM_LOCK_ON
1 CONSTANT Scroll \ KEYBOARD_SCROLL_LOCK_ON
: LedOn ( Led -- ) \ Âêëþ÷èòü èíäèêàòîð
KbdPs2DeviceOpen DUP >R KbdPs2LedGetAll DROP OR
R@ KbdPs2LedSetAll R> CloseHandle
2DROP
;
: LedOff ( Led -- ) \ Âûêëþ÷èòü èíäèêàòîð
INVERT KbdPs2DeviceOpen DUP >R KbdPs2LedGetAll DROP AND
R@ KbdPs2LedSetAll R> CloseHandle
2DROP
;
: LedOn? ( Led -- ? ) \ Âåðíóòü ñîñòîÿíèå èíäèêàòîðà
KbdPs2DeviceOpen DUP >R KbdPs2LedGetAll >R AND R> R> CloseHandle 2DROP 0<>
;
: LedInvert ( Led -- )
DUP LedOn?
IF
LedOff
ELSE
LedOn
THEN
;
;MODULE