| 1 | ; $Id: d32Events.asm,v 1.2 2001-02-23 02:57:53 bird Exp $
|
|---|
| 2 | ;
|
|---|
| 3 | ; d32Events - Code for overriding system events.
|
|---|
| 4 | ;
|
|---|
| 5 | ; Copyright (c) 2000-2001 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
|
|---|
| 6 | ;
|
|---|
| 7 | ; Project Odin Software License can be found in LICENSE.TXT
|
|---|
| 8 | ;
|
|---|
| 9 | .386p
|
|---|
| 10 |
|
|---|
| 11 | ;
|
|---|
| 12 | ; Include files
|
|---|
| 13 | ;
|
|---|
| 14 | include devsegdf.inc
|
|---|
| 15 | include devhlp.inc
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 | ;
|
|---|
| 19 | ; Exported symbols
|
|---|
| 20 | ;
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 | ;
|
|---|
| 24 | ; Externs
|
|---|
| 25 | ;
|
|---|
| 26 | extrn aSysEventsOverrides:dword
|
|---|
| 27 | extrn _TKSSBase16:dword
|
|---|
| 28 | extrn dh_SendEvent:near
|
|---|
| 29 | extrn dh_SendEvent_sel:word
|
|---|
| 30 | extrn RASRST:near
|
|---|
| 31 | extrn _Device_Help:dword
|
|---|
| 32 |
|
|---|
| 33 | CODE16 segment
|
|---|
| 34 | ASSUME CS:CODE16, DS:NOTHING, ES:NOTHING, SS:NOTHING
|
|---|
| 35 |
|
|---|
| 36 |
|
|---|
| 37 | ;;
|
|---|
| 38 | ; Function overriding the dh_SendEvent DevHelp function. If we
|
|---|
| 39 | ; are overriding the event send, we'll post the semphore registered.
|
|---|
| 40 | ; @returns CF set on error, clear on success.
|
|---|
| 41 | ; @param ah Event being signalled. One of the following values (defined in devhlp.inc):
|
|---|
| 42 | ; event_SM_Mou (0) event was Session Manager (mouse)
|
|---|
| 43 | ; event_CtrlBrk (1) event was Ctrl-Break
|
|---|
| 44 | ; event_CtrlC (2) event was Ctrl-C
|
|---|
| 45 | ; event_CtrlScrLk (3) event was Ctrl-ScrollLock
|
|---|
| 46 | ; event_CtrlPrtSc (4) event was Ctrl-PrtSc
|
|---|
| 47 | ; event_ShftPrtSc (5) event was Shift-PrtSc
|
|---|
| 48 | ; event_SM_Kbd (6) event was Session Manager (keyboard)
|
|---|
| 49 | ; event_SM_CAD (7) event was Ctl-Alt-Del
|
|---|
| 50 | ; event_HOT_PLUG (8) Keyboard Hot Plug/Reset
|
|---|
| 51 | ; event_POWER (9) Power suspend event
|
|---|
| 52 | ; event_POWEROFF (10) Power off event
|
|---|
| 53 | ; @param bx Event argument.
|
|---|
| 54 | ; @uses
|
|---|
| 55 | ; @sketch
|
|---|
| 56 | ; @status
|
|---|
| 57 | ; @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
|
|---|
| 58 | ; @remark
|
|---|
| 59 | mydh_SendEvent PROC FAR
|
|---|
| 60 | ; Preserve some registers.
|
|---|
| 61 | push ax
|
|---|
| 62 | push ds
|
|---|
| 63 | push ebx
|
|---|
| 64 |
|
|---|
| 65 | ;
|
|---|
| 66 | ; Check range of the event id.
|
|---|
| 67 | ;
|
|---|
| 68 | cmp ah, event_POWEROFF
|
|---|
| 69 | jg mydse_OS_event ; Jump if event id is greater than event_POWEROFF
|
|---|
| 70 |
|
|---|
| 71 | ;
|
|---|
| 72 | ; Check if we will handle this event or not.
|
|---|
| 73 | ; This is done by checking the entry for this eventid (ah) in
|
|---|
| 74 | ; aSysEventsOverrides (k32HandleSystemEvent.cpp).
|
|---|
| 75 | ;
|
|---|
| 76 | push seg FLAT:CODE32
|
|---|
| 77 | pop ds
|
|---|
| 78 | ASSUME ds:FLAT
|
|---|
| 79 | movzx ebx, ah
|
|---|
| 80 | shl ebx, 3 ; entry size is 8 bytes. 2^3 is 8.
|
|---|
| 81 | cmp byte ptr aSysEventsOverrides[ebx+4], 0 ; check bad flag for this entry.
|
|---|
| 82 | jnz mydse_ErrorReturn ; If the entry is bad we'll fail.
|
|---|
| 83 |
|
|---|
| 84 | cmp dword ptr aSysEventsOverrides[ebx], 0 ; check the hev if it's NULLHANDLE.
|
|---|
| 85 | jz mydse_OS_event
|
|---|
| 86 |
|
|---|
| 87 |
|
|---|
| 88 | ;
|
|---|
| 89 | ; Post semaphore handle.
|
|---|
| 90 | ;
|
|---|
| 91 | call PostEventSem
|
|---|
| 92 |
|
|---|
| 93 |
|
|---|
| 94 | ;
|
|---|
| 95 | ; Return to the caller. (dirty hack)
|
|---|
| 96 | ; On the stack we have a 16-bit near return address in the
|
|---|
| 97 | ; same segment as dh_SendEvent. To do a far return as we have to
|
|---|
| 98 | ; do we'll have to change this into an far 16-bit pointer.
|
|---|
| 99 | ; 0. restore ebx and save bp (since we can't use sp directly).
|
|---|
| 100 | ; 1. reserve a 16-bit word. This is allready done when pushing ax in the prolog.
|
|---|
| 101 | ; 2. move near return to word from step 1. (sp+0)
|
|---|
| 102 | ; 3. get the selector of the dh_SendEvent segment.
|
|---|
| 103 | ; 4. move the selector of the dh_SendEvent segment to
|
|---|
| 104 | ; the near return word. (sp+2)
|
|---|
| 105 | ; 5. Restore bp and ds, and return far.
|
|---|
| 106 | mydse_ret:
|
|---|
| 107 | pop ebx ; 0
|
|---|
| 108 | push bp ; 0
|
|---|
| 109 | mov bp, sp ; 0
|
|---|
| 110 | push eax ; Save eax value (error code)
|
|---|
| 111 | mov ax, ss:[bp+6] ; Fetch return offset.
|
|---|
| 112 | mov ss:[bp+4], ax ; Write over the original ax value pushed at function start.
|
|---|
| 113 | push DATA16 ; 3
|
|---|
| 114 | pop ds ; 3
|
|---|
| 115 | ASSUME ds:DATA16 ; 3
|
|---|
| 116 | mov ax, cs:dh_SendEvent_sel ; 3
|
|---|
| 117 | mov ss:[bp+6], ax ; 4
|
|---|
| 118 | pop eax ; restore eax.
|
|---|
| 119 | pop bp ; 5
|
|---|
| 120 | pop ds ; 5
|
|---|
| 121 | retf ; 5
|
|---|
| 122 |
|
|---|
| 123 |
|
|---|
| 124 | ;
|
|---|
| 125 | ; We failed to send the signal or the hev is bad.
|
|---|
| 126 | ;
|
|---|
| 127 | mydse_ErrorReturn:
|
|---|
| 128 | stc ; set carry flag.
|
|---|
| 129 | jmp mydse_ret
|
|---|
| 130 |
|
|---|
| 131 |
|
|---|
| 132 | ;
|
|---|
| 133 | ; Let OS/2 take care of this event.
|
|---|
| 134 | ;
|
|---|
| 135 | mydse_OS_event:
|
|---|
| 136 | pop ebx
|
|---|
| 137 | pop ds
|
|---|
| 138 | pop ax
|
|---|
| 139 | jmp dh_SendEvent
|
|---|
| 140 | mydh_SendEvent ENDP
|
|---|
| 141 |
|
|---|
| 142 |
|
|---|
| 143 |
|
|---|
| 144 | ;;
|
|---|
| 145 | ;
|
|---|
| 146 | ; @returns Not expected to return, but keyboard code handles that quite well it seems.
|
|---|
| 147 | ; @param
|
|---|
| 148 | ; @uses
|
|---|
| 149 | ; @equiv
|
|---|
| 150 | ; @time
|
|---|
| 151 | ; @sketch
|
|---|
| 152 | ; @status
|
|---|
| 153 | ; @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
|
|---|
| 154 | ; @remark Assumes that caller is kdbbase.sys and it is called far.
|
|---|
| 155 | myRASRST PROC FAR
|
|---|
| 156 | ASSUME ds:nothing, ss:nothing
|
|---|
| 157 |
|
|---|
| 158 | ; Preserve some registers.
|
|---|
| 159 | push ds
|
|---|
| 160 | push ebx
|
|---|
| 161 |
|
|---|
| 162 |
|
|---|
| 163 | ;
|
|---|
| 164 | ; Check if we're going to override this dump request.
|
|---|
| 165 | ;
|
|---|
| 166 | push seg FLAT:CODE32
|
|---|
| 167 | pop ds
|
|---|
| 168 | ASSUME ds:FLAT
|
|---|
| 169 | mov ebx, 8 * 0ah ; Entry of the Ctrl-Alt-2xNumLock event.
|
|---|
| 170 | cmp byte ptr aSysEventsOverrides[ebx+4], 0 ; check bad flag for this entry.
|
|---|
| 171 | jnz myRASRST_ret ; If the entry is bad we'll fail.
|
|---|
| 172 |
|
|---|
| 173 | cmp dword ptr aSysEventsOverrides[ebx], 0 ; check the hev if it's NULLHANDLE.
|
|---|
| 174 | jz myRASRST_dump
|
|---|
| 175 |
|
|---|
| 176 | ;
|
|---|
| 177 | ; TODO - add check if we're actually being called from kbdbase.sys!
|
|---|
| 178 | ; If not called from kbdbase.sys we should do the dump.
|
|---|
| 179 |
|
|---|
| 180 |
|
|---|
| 181 | ;
|
|---|
| 182 | ; Post semaphore handle.
|
|---|
| 183 | ;
|
|---|
| 184 | call PostEventSem
|
|---|
| 185 |
|
|---|
| 186 | ;
|
|---|
| 187 | ; Return - here we assume return far to the keybase.sys driver.
|
|---|
| 188 | ;
|
|---|
| 189 | myRASRST_ret:
|
|---|
| 190 | pop ebx
|
|---|
| 191 | pop ds
|
|---|
| 192 | retf
|
|---|
| 193 |
|
|---|
| 194 |
|
|---|
| 195 | ;
|
|---|
| 196 | ; Call the real RASRST.
|
|---|
| 197 | ;
|
|---|
| 198 | myRASRST_dump:
|
|---|
| 199 | pop ebx
|
|---|
| 200 | pop ds
|
|---|
| 201 | jmp RASRST
|
|---|
| 202 | myRASRST ENDP
|
|---|
| 203 |
|
|---|
| 204 |
|
|---|
| 205 | ;;
|
|---|
| 206 | ; Internal function which posts the semaphore of a given entry.
|
|---|
| 207 | ; @returns Return from dh_PostEventSem.
|
|---|
| 208 | ; CF clear on success.
|
|---|
| 209 | ; CF set on error, with errorcode in eax.
|
|---|
| 210 | ; @param ebx Offset of event entry to post.
|
|---|
| 211 | ; @uses eax.
|
|---|
| 212 | PostEventSem PROC NEAR
|
|---|
| 213 | push esi ; Save registers - can't be too carefull... paranoia
|
|---|
| 214 | push edi
|
|---|
| 215 | push edx
|
|---|
| 216 | push ecx
|
|---|
| 217 | push ebx
|
|---|
| 218 | push ebp
|
|---|
| 219 | push es
|
|---|
| 220 | push ds
|
|---|
| 221 |
|
|---|
| 222 | mov eax, aSysEventsOverrides[ebx] ; Get hev from the entry.
|
|---|
| 223 | mov dh, DevHlp_PostEventSem ; Post event sem dev help.
|
|---|
| 224 | call [_Device_Help]
|
|---|
| 225 |
|
|---|
| 226 | pop ds ; Restore registers.
|
|---|
| 227 | pop es
|
|---|
| 228 | pop ebp
|
|---|
| 229 | pop ebx
|
|---|
| 230 | pop ecx
|
|---|
| 231 | pop edx
|
|---|
| 232 | pop edi
|
|---|
| 233 | pop esi
|
|---|
| 234 |
|
|---|
| 235 | jnc post_ok ; Check for errors
|
|---|
| 236 | ; Post returned errorcode. We'll ignore ERROR_ALREADY_POSTED and ERROR_TOO_MANY_POSTS.
|
|---|
| 237 | cmp eax, 299 ;(ERROR_ALREADY_POSTED)
|
|---|
| 238 | je post_ok
|
|---|
| 239 | cmp eax, 298 ;(ERROR_TOO_MANY_POSTS)
|
|---|
| 240 | je post_ok
|
|---|
| 241 |
|
|---|
| 242 | ;
|
|---|
| 243 | ; Failed to post semaphore - set bad flag to true.
|
|---|
| 244 | ;
|
|---|
| 245 | mov byte ptr aSysEventsOverrides[ebx+4], 1 ; check bad flag for this entry.
|
|---|
| 246 |
|
|---|
| 247 | post_ok:
|
|---|
| 248 | ret
|
|---|
| 249 | PostEventSem ENDP
|
|---|
| 250 |
|
|---|
| 251 |
|
|---|
| 252 | CODE16 ends
|
|---|
| 253 |
|
|---|
| 254 |
|
|---|
| 255 | CODE32 segment
|
|---|
| 256 | CODE32START label byte
|
|---|
| 257 |
|
|---|
| 258 | CODE32 ends
|
|---|
| 259 |
|
|---|
| 260 | END
|
|---|
| 261 |
|
|---|
| 262 |
|
|---|