| 1 | /* $Id: $ */ | 
|---|
| 2 | /** @file | 
|---|
| 3 | * | 
|---|
| 4 | * spy1 - header for structure and protptypes shared with the hook. | 
|---|
| 5 | * | 
|---|
| 6 | * Copyright (c) 2006 knut st. osmundsen <bird@anduin.net> | 
|---|
| 7 | * | 
|---|
| 8 | * GPL | 
|---|
| 9 | * | 
|---|
| 10 | */ | 
|---|
| 11 |  | 
|---|
| 12 | #ifndef __spy1_h__ | 
|---|
| 13 | #define __spy1_h__ | 
|---|
| 14 |  | 
|---|
| 15 | /** @name Various OS/2 stuff from the DDK. | 
|---|
| 16 | * Mainly from video/rel/.../pmwinp.mac and pmwinx.h. | 
|---|
| 17 | * @{ */ | 
|---|
| 18 |  | 
|---|
| 19 | /** | 
|---|
| 20 | * Keyboard event. | 
|---|
| 21 | */ | 
|---|
| 22 | typedef struct _KBDEVENT {    /* kevt */ | 
|---|
| 23 | BYTE monFlags;          /* Open, Close and Flush monitor flags */ | 
|---|
| 24 | BYTE scancode;          /* Original scan code (actually high byte of | 
|---|
| 25 | monitor flags */ | 
|---|
| 26 | BYTE xlatedchar;        /* Output of interrupt level character translation | 
|---|
| 27 | table */ | 
|---|
| 28 |  | 
|---|
| 29 | BYTE xlatedscan;        /* Translated scan code.  Different only for | 
|---|
| 30 | the enhanced keyboard */ | 
|---|
| 31 |  | 
|---|
| 32 | USHORT shiftDBCS;         /* DBCS shift state and status */ | 
|---|
| 33 | USHORT shiftstate;        /* Current state of shift keys */ | 
|---|
| 34 | ULONG time;             /* millisecond counter time stamp */ | 
|---|
| 35 | USHORT ddFlags;           /* Keyboard device driver flags */ | 
|---|
| 36 | } KBDEVENT; | 
|---|
| 37 | typedef KBDEVENT *PKBDEVENT; | 
|---|
| 38 |  | 
|---|
| 39 | // guess MON_* are for the monFlags field. | 
|---|
| 40 | #define MON_OPEN        EQU     0001H | 
|---|
| 41 | #define MON_CLOSE       EQU     0002H | 
|---|
| 42 | #define MON_FLUSH       EQU     0004H | 
|---|
| 43 | // guess KSS_* is for the shiftstate field. | 
|---|
| 44 | #define KSS_SYSREQ      EQU     8000H | 
|---|
| 45 | #define KSS_CAPSLOCK    EQU     4000H | 
|---|
| 46 | #define KSS_NUMLOCK     EQU     2000H | 
|---|
| 47 | #define KSS_SCROLLLOCK  EQU     1000H | 
|---|
| 48 | #define KSS_RIGHTALT    EQU     0800H | 
|---|
| 49 | #define KSS_RIGHTCTRL   EQU     0400H | 
|---|
| 50 | #define KSS_LEFTALT     EQU     0200H | 
|---|
| 51 | #define KSS_LEFTCTRL    EQU     0100H | 
|---|
| 52 | #define KSS_INSERTON    EQU     0080H | 
|---|
| 53 | #define KSS_CAPSLOCKON  EQU     0040H | 
|---|
| 54 | #define KSS_NUMLOCKON   EQU     0020H | 
|---|
| 55 | #define KSS_SCROLLLOCKON        EQU     0010H | 
|---|
| 56 | #define KSS_EITHERALT   EQU     0008H | 
|---|
| 57 | #define KSS_EITHERCTRL  EQU     0004H | 
|---|
| 58 | #define KSS_LEFTSHIFT   EQU     0002H | 
|---|
| 59 | #define KSS_RIGHTSHIFT  EQU     0001H | 
|---|
| 60 | #define KSS_EITHERSHIFT EQU     0003H | 
|---|
| 61 | /* Valid values for ddFlags field */ | 
|---|
| 62 | #define KDD_MONFLAG1    0x8000 // bird: conflicts with KDD_KC_LONEKEY - relevant for VIOCHAR? | 
|---|
| 63 | #define KDD_MONFLAG2    0x4000 // bird: conflicts with KDD_KC_PREVDOWN - relevant for VIOCHAR? | 
|---|
| 64 | #define KDD_RESERVED    0x3C00 | 
|---|
| 65 | #define KDD_ACCENTED    0x0200 | 
|---|
| 66 | #define KDD_MULTIMAKE   0x0100 | 
|---|
| 67 | #define KDD_SECONDARY   0x0080 | 
|---|
| 68 | #define KDD_BREAK       0x0040 | 
|---|
| 69 | #define KDD_EXTENDEDKEY 0x0020 | 
|---|
| 70 | #define KDD_ACTIONFIELD 0x001F | 
|---|
| 71 | #define KDD_KC_LONEKEY  0x8000 | 
|---|
| 72 | #define KDD_KC_PREVDOWN 0x4000 | 
|---|
| 73 | #define KDD_KC_KEYUP    0x2000 | 
|---|
| 74 | #define KDD_KC_ALT      0x1000 | 
|---|
| 75 | #define KDD_KC_CTRL     0x0800 | 
|---|
| 76 | #define KDD_KC_SHIFT    0x0400 | 
|---|
| 77 | #define KDD_KC_FLAGS    0x0FC00 | 
|---|
| 78 | /* Valid values for KDD_ACTIONFIELD portion of ddFlags field */ | 
|---|
| 79 | #define KDD_PUTINKIB    0x0000 | 
|---|
| 80 | #define KDD_ACK 0x0001 | 
|---|
| 81 | #define KDD_PREFIXKEY   0x0002 | 
|---|
| 82 | #define KDD_OVERRUN     0x0003 | 
|---|
| 83 | #define KDD_RESEND      0x0004 | 
|---|
| 84 | #define KDD_REBOOTKEY   0x0005 | 
|---|
| 85 | #define KDD_DUMPKEY     0x0006 | 
|---|
| 86 | #define KDD_SHIFTKEY    0x0007 | 
|---|
| 87 | #define KDD_PAUSEKEY    0x0008 | 
|---|
| 88 | #define KDD_PSEUDOPAUSE 0x0009 | 
|---|
| 89 | #define KDD_WAKEUPKEY   0x000A | 
|---|
| 90 | #define KDD_BADACCENT   0x000B | 
|---|
| 91 | #define KDD_HOTKEY      0x000C | 
|---|
| 92 | #define KDD_ACCENTKEY   0x0010 | 
|---|
| 93 | #define KDD_BREAKKEY    0x0011 | 
|---|
| 94 | #define KDD_PSEUDOBREAK 0x0012 | 
|---|
| 95 | #define KDD_PRTSCKEY    0x0013 | 
|---|
| 96 | #define KDD_PRTECHOKEY  0x0014 | 
|---|
| 97 | #define KDD_PSEUDOPRECH 0x0015 | 
|---|
| 98 | #define KDD_STATUSCHG   0x0016 | 
|---|
| 99 | #define KDD_WRITTENKEY  0x0017 | 
|---|
| 100 | #define KDD_UNDEFINED   0x001F | 
|---|
| 101 |  | 
|---|
| 102 | /// PMWIN.174 | 
|---|
| 103 | KBDEVENT KbdPacket[2]; | 
|---|
| 104 |  | 
|---|
| 105 | /** @} */ | 
|---|
| 106 |  | 
|---|
| 107 |  | 
|---|
| 108 | /** The event type. */ | 
|---|
| 109 | typedef enum SPY1EVENTTYPE | 
|---|
| 110 | { | 
|---|
| 111 | /** The usual invalid entry. */ | 
|---|
| 112 | SPY1EVENTTYPE_INVALID = 0, | 
|---|
| 113 | /** A qmsg being removed. | 
|---|
| 114 | * SPY1EVENT::u::Msg contains the message. */ | 
|---|
| 115 | SPY1EVENTTYPE_MSG_REMOVED, | 
|---|
| 116 | /** A qmsg being peeked at. | 
|---|
| 117 | * SPY1EVENT::u::Msg contains the message. */ | 
|---|
| 118 | SPY1EVENTTYPE_MSG_PEEK | 
|---|
| 119 | } SPY1EVENTTYPE; | 
|---|
| 120 |  | 
|---|
| 121 | /** | 
|---|
| 122 | * A recorded event. | 
|---|
| 123 | */ | 
|---|
| 124 | typedef struct SPY1EVENT | 
|---|
| 125 | { | 
|---|
| 126 | /** the type of event. */ | 
|---|
| 127 | SPY1EVENTTYPE   enmType; | 
|---|
| 128 | /** The process in which we recorded the event. */ | 
|---|
| 129 | ULONG           pid; | 
|---|
| 130 | /** The thread in which we recorded the event. */ | 
|---|
| 131 | ULONG           tid; | 
|---|
| 132 | /** The hook type which recorded the event. */ | 
|---|
| 133 | ULONG           ulHook; | 
|---|
| 134 | /** Type specific data. */ | 
|---|
| 135 | union | 
|---|
| 136 | { | 
|---|
| 137 | /** A message. */ | 
|---|
| 138 | QMSG        Msg; | 
|---|
| 139 | /* ... more ... */ | 
|---|
| 140 | } u; | 
|---|
| 141 | } SPY1EVENT, *PSPY1EVENT; | 
|---|
| 142 |  | 
|---|
| 143 |  | 
|---|
| 144 | int EXPENTRY SetHooks(HAB hab); | 
|---|
| 145 | int EXPENTRY ReleaseHooks(HAB hab); | 
|---|
| 146 | int EXPENTRY GetEvent(PSPY1EVENT pEvent, ULONG ulTimeout); | 
|---|
| 147 |  | 
|---|
| 148 |  | 
|---|
| 149 | /** @name The hook functions. | 
|---|
| 150 | * @{ */ | 
|---|
| 151 | BOOL EXPENTRY InputHook(HAB hab, PQMSG pQmsg, ULONG fs); | 
|---|
| 152 | VOID EXPENTRY JournalRecordHook(HAB hab, PQMSG pQmsg); | 
|---|
| 153 | /** @} */ | 
|---|
| 154 |  | 
|---|
| 155 | #endif | 
|---|
| 156 |  | 
|---|