source: trunk/src/user32/hooks.cpp@ 4

Last change on this file since 4 was 4, checked in by ktk, 26 years ago

Import

File size: 35.0 KB
Line 
1/* $Id: hooks.cpp,v 1.1 1999-05-24 20:20:01 ktk Exp $ */
2
3/*
4 * Win32 hook class for OS/2
5 *
6 * Copyright 1998 Sander van Leeuwen
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#include <os2win.h>
13#include <stdarg.h>
14#include <assert.h>
15#include "misc.h"
16#include "user32.h"
17#include "hooks.h"
18
19static LRESULT OS2HkWindowProc(int code, WPARAM wParam, LPARAM lParam);
20static LRESULT OS2HkCBTProc(int code, WPARAM wParam, LPARAM lParam);
21static LRESULT OS2HkDebugProc(int code, WPARAM wParam, LPARAM lParam);
22static LRESULT OS2HkMouseProc(int code, WPARAM wParam, LPARAM lParam);
23static LRESULT OS2HkKeyboardProc(int code, WPARAM wParam, LPARAM lParam);
24static LRESULT OS2HkGetMessageProc(int code, WPARAM wParam, LPARAM lParam);
25static LRESULT OS2HkMsgFilterProc(int code, WPARAM wParam, LPARAM lParam);
26static LRESULT OS2HkSysMsgFilterProc(int code, WPARAM wParam, LPARAM lParam);
27static LRESULT OS2HkShellProc(int code, WPARAM wParam, LPARAM lParam);
28static LRESULT OS2HkJrnlPlaybackProc(int code, WPARAM wParam, LPARAM lParam);
29static LRESULT OS2HkJrnlRecordProc(int code, WPARAM wParam, LPARAM lParam);
30
31//******************************************************************************
32//HkWindow class
33//******************************************************************************
34HkWindow::HkWindow(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
35{
36 //Insert it in front of the rest
37 next = hooks;
38 hooks = this;
39
40 pCallback = pUserCallback;
41 hhook = hook;
42 this->hinst = hinst;
43 this->dwThreadId = dwThreadId;
44 fRecursive = FALSE;
45}
46//******************************************************************************
47//******************************************************************************
48HkWindow::~HkWindow()
49{
50 HkWindow *hook = HkWindow::hooks;
51
52 if(hook == this) {
53 hooks = next;
54 }
55 else {
56 while(hook->next != NULL) {
57 if(hook->next == this) {
58 hook->next = next;
59 break;
60 }
61 hook = hook->next;
62 }
63 }
64}
65//******************************************************************************
66//******************************************************************************
67HOOKPROC_O32 HkWindow::GetOS2Hook()
68{
69 return(OS2HkWindowProc);
70}
71//******************************************************************************
72//******************************************************************************
73BOOL HkWindow::UnHookWindowsHook(HHOOK hhook)
74{
75 HkWindow *hook = HkWindow::hooks;
76
77 while(hook != NULL) {
78 if(hook->hhook == hhook) {
79 delete hook;
80 return(TRUE);
81 }
82 hook = hook->next;
83 }
84 return(FALSE);
85}
86//******************************************************************************
87//******************************************************************************
88HHOOK HkWindow::FindHookProc(HOOKPROC hkprc)
89{
90 HkWindow *hook = HkWindow::hooks;
91
92 while(hook != NULL) {
93 if(hook->pCallback == hkprc) {
94 return(hook->hhook);
95 }
96 hook = hook->next;
97 }
98#ifdef DEBUG
99 WriteLog("HkWindow::FindHookProc, couldn't find proc %X\n", hkprc);
100#endif
101 return(NULL);
102}
103//******************************************************************************
104//******************************************************************************
105static LRESULT OS2HkWindowProc(int code, WPARAM wParam, LPARAM lParam)
106{
107 HkWindow *hook = HkWindow::hooks;
108 LRESULT rc;
109
110 while(hook != NULL) {
111 if(hook->fRecursive == FALSE) {
112 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
113 hook->fRecursive = TRUE;
114 rc = hook->pCallback(code, wParam, lParam);
115 hook->fRecursive = FALSE;
116 return(rc);
117 }
118 }
119 hook = hook->next;
120 }
121 return(0);
122}
123//******************************************************************************
124//******************************************************************************
125HkWindow *HkWindow::hooks = NULL;
126
127//******************************************************************************
128//HkCBT class
129//******************************************************************************
130HkCBT::HkCBT(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
131{
132 //Insert it in front of the rest
133 next = hooks;
134 hooks = this;
135
136 pCallback = pUserCallback;
137 hhook = (HHOOK)this;
138 this->hinst = hinst;
139 this->dwThreadId = dwThreadId;
140 fRecursive = FALSE;
141}
142//******************************************************************************
143//******************************************************************************
144HkCBT::~HkCBT()
145{
146 HkCBT *hook = HkCBT::hooks;
147
148 if(hook == this) {
149 hooks = next;
150 }
151 else {
152 while(hook->next != NULL) {
153 if(hook->next == this) {
154 hook->next = next;
155 break;
156 }
157 hook = hook->next;
158 }
159 }
160}
161//******************************************************************************
162//******************************************************************************
163HOOKPROC_O32 HkCBT::GetOS2Hook()
164{ //should never be called (Open32 CBT hook is broken)
165 _interrupt(3);
166 return 0;
167// return(OS2HkCBTProc);
168}
169//******************************************************************************
170//******************************************************************************
171BOOL HkCBT::UnHookWindowsHook(HHOOK hhook)
172{
173 HkCBT *hook = HkCBT::hooks;
174
175 while(hook != NULL) {
176 if(hook->hhook == hhook) {
177 delete hook;
178 return(TRUE);
179 }
180 hook = hook->next;
181 }
182 return(FALSE);
183}
184//******************************************************************************
185//******************************************************************************
186HHOOK HkCBT::FindHookProc(HOOKPROC hkprc)
187{
188 HkCBT *hook = HkCBT::hooks;
189
190 while(hook != NULL) {
191 if(hook->pCallback == hkprc) {
192 return(hook->hhook);
193 }
194 hook = hook->next;
195 }
196#ifdef DEBUG
197 WriteLog("HkCBT::FindHookProc, couldn't find proc %X\n", hkprc);
198#endif
199 return(NULL);
200}
201//******************************************************************************
202//******************************************************************************
203LRESULT HkCBT::OS2HkCBTProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
204{
205 HkCBT *hook = HkCBT::hooks;
206 LRESULT rc;
207
208 while(hook != NULL) {
209 if(hook->fRecursive == FALSE) {
210 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
211 hook->fRecursive = TRUE;
212 //Save these for possible call to CallNextHookEx
213 hook->orghwnd = hwnd;
214 hook->orgMsg = Msg;
215 hook->orgwParam = wParam;
216 hook->orglParam = lParam;
217 rc = hook->CBTCallback(hwnd, Msg, wParam, lParam);
218
219 hook->fRecursive = FALSE;
220 return(rc);
221 }
222 }
223 hook = hook->next;
224 }
225#ifdef DEBUG1
226 WriteLog("HkCBT: No hooks found!\n");
227#endif
228 return(0);
229}
230//******************************************************************************
231//******************************************************************************
232LRESULT HkCBT::CBTCallback(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
233{
234 CBT_CREATEWNDA createwnd;
235 CREATESTRUCTA dlgcs = {0};
236 CBTACTIVATESTRUCT activate;
237 HWND active, inactive;
238 RECT rect;
239
240 switch(message) {
241 case WM_CREATE:
242 case WM_NCCREATE:
243#ifdef DEBUG
244 WriteLog("HkCBT: WM_CREATE\n");
245#endif
246 createwnd.lpcs = (CREATESTRUCTA *)lParam;
247 createwnd.hwndInsertAfter = createwnd.lpcs->hwndParent; //TODO: not correct
248 return(pCallback(HCBT_CREATEWND, hwnd, (LPARAM)&createwnd));
249 case WM_INITDIALOG:
250#ifdef DEBUG
251 WriteLog("HkCBT: WM_INITDIALOG\n");
252#endif
253 createwnd.lpcs = &dlgcs;
254 createwnd.hwndInsertAfter = GetParent(hwnd); //TODO: not correct
255 return(pCallback(HCBT_CREATEWND, hwnd, (LPARAM)&createwnd));
256 case WM_MDICREATE:
257#ifdef DEBUG
258 WriteLog("HkCBT: WM_MDICREATE\n");
259#endif
260 createwnd.lpcs = (CREATESTRUCTA *)lParam; //==CLIENTCREATESTRUCT *
261 createwnd.hwndInsertAfter = GetParent(hwnd); //TODO: not correct
262 return(pCallback(HCBT_CREATEWND, hwnd, (LPARAM)&createwnd));
263 case WM_DESTROY:
264 case WM_NCDESTROY:
265#ifdef DEBUG
266 WriteLog("HkCBT: WM_DESTROY\n");
267#endif
268 return(pCallback(HCBT_DESTROYWND, hwnd, 0));
269 case WM_ACTIVATE:
270 case WM_NCACTIVATE:
271#ifdef DEBUG
272 WriteLog("HkCBT: WM_ACTIVATE\n");
273#endif
274 activate.fMouse = (LOWORD(wParam) == WA_CLICKACTIVE);
275 if(LOWORD(wParam) == WA_INACTIVE) {
276 active = lParam;
277 inactive = hwnd;
278 }
279 else {
280 active = hwnd;
281 inactive = lParam;
282 }
283 activate.hWndActive = active;
284 return(pCallback(HCBT_ACTIVATE, inactive, (LPARAM)&activate));
285 case WM_SETFOCUS:
286#ifdef DEBUG
287 WriteLog("HkCBT: WM_SETFOCUS\n");
288#endif
289 return(pCallback(HCBT_SETFOCUS, hwnd, wParam));
290 case WM_MOVE:
291#ifdef DEBUG
292 WriteLog("HkCBT: WM_MOVE\n");
293#endif
294 GetWindowRect(hwnd, &rect);
295 rect.left = LOWORD(lParam);
296 rect.top = HIWORD(lParam);
297 return(pCallback(HCBT_MOVESIZE, hwnd, (LPARAM)&rect));
298 case WM_SIZE:
299#ifdef DEBUG
300 WriteLog("HkCBT: WM_SIZE\n");
301#endif
302 switch(wParam) {
303 case SIZE_MINIMIZED: //TODO:not correct
304 return(pCallback(HCBT_MINMAX, hwnd, SW_SHOWMINIMIZED));
305 case SIZE_MAXIMIZED: //TODO:not correct
306 return(pCallback(HCBT_MINMAX, hwnd, SW_SHOWMAXIMIZED));
307 case SIZE_RESTORED:
308 GetWindowRect(hwnd, &rect);
309 rect.right = rect.left + LOWORD(lParam); //== new width
310 rect.bottom = rect.top - HIWORD(lParam); //== new height
311 return(pCallback(HCBT_MOVESIZE, hwnd, (LPARAM)&rect));
312 }
313 case WM_QUEUESYNC:
314#ifdef DEBUG
315 WriteLog("HkCBT: WM_QUEUESYNC\n");
316#endif
317 return(pCallback(HCBT_QS, 0, 0));
318 case WM_SYSCOMMAND:
319#ifdef DEBUG
320 WriteLog("HkCBT: WM_SYSCOMMAND\n");
321#endif
322 return(pCallback(HCBT_SYSCOMMAND, wParam, lParam));
323#ifdef DEBUG1
324 default:
325 WriteLog("HkCBT: Other msg %X\n", message);
326 break;
327#endif
328
329//TODO: HCBT_KEYSKIPPED & HCBT_CLICKSKIPPED
330 }
331 return(0);
332}
333//******************************************************************************
334//******************************************************************************
335HkCBT *HkCBT::FindHook(HHOOK hhook)
336{
337 HkCBT *hook = HkCBT::hooks;
338
339 while(hook != NULL) {
340 if(hook->hhook == hhook) {
341 return(hook);
342 }
343 hook = hook->next;
344 }
345 return(NULL);
346}
347//******************************************************************************
348//******************************************************************************
349LRESULT HkCBT::CallNextHook(HHOOK hhook, int nCode, WPARAM wParam, LPARAM lParam)
350{
351 HkCBT *hkhook = (HkCBT *)hhook;
352
353 if(hkhook->next != NULL) {
354 return(hkhook->CBTCallback(hkhook->orghwnd, hkhook->orgMsg, hkhook->orgwParam, hkhook->orglParam));
355 }
356 else return(0);
357}
358//******************************************************************************
359//******************************************************************************
360HkCBT *HkCBT::hooks = NULL;
361
362//******************************************************************************
363//HkDebug class
364//******************************************************************************
365HkDebug::HkDebug(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
366{
367 //Insert it in front of the rest
368 next = hooks;
369 hooks = this;
370
371 pCallback = pUserCallback;
372 hhook = hook;
373 this->hinst = hinst;
374 this->dwThreadId = dwThreadId;
375 fRecursive = FALSE;
376}
377//******************************************************************************
378//******************************************************************************
379HkDebug::~HkDebug()
380{
381 HkDebug *hook = HkDebug::hooks;
382
383 if(hook == this) {
384 hooks = next;
385 }
386 else {
387 while(hook->next != NULL) {
388 if(hook->next == this) {
389 hook->next = next;
390 break;
391 }
392 hook = hook->next;
393 }
394 }
395}
396//******************************************************************************
397//******************************************************************************
398HOOKPROC_O32 HkDebug::GetOS2Hook()
399{
400 return(OS2HkDebugProc);
401}
402//******************************************************************************
403//******************************************************************************
404BOOL HkDebug::UnHookWindowsHook(HHOOK hhook)
405{
406 HkDebug *hook = HkDebug::hooks;
407
408 while(hook != NULL) {
409 if(hook->hhook == hhook) {
410 delete hook;
411 return(TRUE);
412 }
413 hook = hook->next;
414 }
415 return(FALSE);
416}
417//******************************************************************************
418//******************************************************************************
419HHOOK HkDebug::FindHookProc(HOOKPROC hkprc)
420{
421 HkDebug *hook = HkDebug::hooks;
422
423 while(hook != NULL) {
424 if(hook->pCallback == hkprc) {
425 return(hook->hhook);
426 }
427 hook = hook->next;
428 }
429#ifdef DEBUG
430 WriteLog("HkDebug::FindHookProc, couldn't find proc %X\n", hkprc);
431#endif
432 return(NULL);
433}
434//******************************************************************************
435//******************************************************************************
436static LRESULT OS2HkDebugProc(int code, WPARAM wParam, LPARAM lParam)
437{
438 HkDebug *hook = HkDebug::hooks;
439 LRESULT rc;
440
441 while(hook != NULL) {
442 if(hook->fRecursive == FALSE) {
443 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
444 hook->fRecursive = TRUE;
445 rc = hook->pCallback(code, wParam, lParam);
446 hook->fRecursive = FALSE;
447 return(rc);
448 }
449 }
450 hook = hook->next;
451 }
452 return(0);
453}
454//******************************************************************************
455//******************************************************************************
456HkDebug *HkDebug::hooks = NULL;
457
458//******************************************************************************
459//HkGetMessage class
460//******************************************************************************
461HkGetMessage::HkGetMessage(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
462{
463 //Insert it in front of the rest
464 next = hooks;
465 hooks = this;
466
467 pCallback = pUserCallback;
468 hhook = hook;
469 this->hinst = hinst;
470 this->dwThreadId = dwThreadId;
471 fRecursive = FALSE;
472}
473//******************************************************************************
474//******************************************************************************
475HkGetMessage::~HkGetMessage()
476{
477 HkGetMessage *hook = HkGetMessage::hooks;
478
479 if(hook == this) {
480 hooks = next;
481 }
482 else {
483 while(hook->next != NULL) {
484 if(hook->next == this) {
485 hook->next = next;
486 break;
487 }
488 hook = hook->next;
489 }
490 }
491}
492//******************************************************************************
493//******************************************************************************
494HOOKPROC_O32 HkGetMessage::GetOS2Hook()
495{
496 return(OS2HkGetMessageProc);
497}
498//******************************************************************************
499//******************************************************************************
500BOOL HkGetMessage::UnHookWindowsHook(HHOOK hhook)
501{
502 HkGetMessage *hook = HkGetMessage::hooks;
503
504 while(hook != NULL) {
505 if(hook->hhook == hhook) {
506 delete hook;
507 return(TRUE);
508 }
509 hook = hook->next;
510 }
511 return(FALSE);
512}
513//******************************************************************************
514//******************************************************************************
515HHOOK HkGetMessage::FindHookProc(HOOKPROC hkprc)
516{
517 HkGetMessage *hook = HkGetMessage::hooks;
518
519 while(hook != NULL) {
520 if(hook->pCallback == hkprc) {
521 return(hook->hhook);
522 }
523 hook = hook->next;
524 }
525#ifdef DEBUG
526 WriteLog("HkGetMessage::FindHookProc, couldn't find proc %X\n", hkprc);
527#endif
528 return(NULL);
529}
530//******************************************************************************
531//******************************************************************************
532static LRESULT OS2HkGetMessageProc(int code, WPARAM wParam, LPARAM lParam)
533{
534 HkGetMessage *hook = HkGetMessage::hooks;
535 LRESULT rc;
536
537 while(hook != NULL) {
538 if(hook->fRecursive == FALSE) {
539 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
540 hook->fRecursive = TRUE;
541 rc = hook->pCallback(code, wParam, lParam);
542 hook->fRecursive = FALSE;
543 return(rc);
544 }
545 }
546 hook = hook->next;
547 }
548 return(0);
549}
550//******************************************************************************
551//******************************************************************************
552HkGetMessage *HkGetMessage::hooks = NULL;
553
554//******************************************************************************
555//HkMouse class
556//******************************************************************************
557HkMouse::HkMouse(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
558{
559 //Insert it in front of the rest
560 next = hooks;
561 hooks = this;
562
563 pCallback = pUserCallback;
564 hhook = hook;
565 this->hinst = hinst;
566 this->dwThreadId = dwThreadId;
567 fRecursive = FALSE;
568}
569//******************************************************************************
570//******************************************************************************
571HkMouse::~HkMouse()
572{
573 HkMouse *hook = HkMouse::hooks;
574
575 if(hook == this) {
576 hooks = next;
577 }
578 else {
579 while(hook->next != NULL) {
580 if(hook->next == this) {
581 hook->next = next;
582 break;
583 }
584 hook = hook->next;
585 }
586 }
587}
588//******************************************************************************
589//******************************************************************************
590HOOKPROC_O32 HkMouse::GetOS2Hook()
591{
592 return(OS2HkMouseProc);
593}
594//******************************************************************************
595//******************************************************************************
596BOOL HkMouse::UnHookWindowsHook(HHOOK hhook)
597{
598 HkMouse *hook = HkMouse::hooks;
599
600 while(hook != NULL) {
601 if(hook->hhook == hhook) {
602 delete hook;
603 return(TRUE);
604 }
605 hook = hook->next;
606 }
607 return(FALSE);
608}
609//******************************************************************************
610//******************************************************************************
611HHOOK HkMouse::FindHookProc(HOOKPROC hkprc)
612{
613 HkMouse *hook = HkMouse::hooks;
614
615 while(hook != NULL) {
616 if(hook->pCallback == hkprc) {
617 return(hook->hhook);
618 }
619 hook = hook->next;
620 }
621#ifdef DEBUG
622 WriteLog("HkMouse::FindHookProc, couldn't find proc %X\n", hkprc);
623#endif
624 return(NULL);
625}
626//******************************************************************************
627//******************************************************************************
628static LRESULT OS2HkMouseProc(int code, WPARAM wParam, LPARAM lParam)
629{
630 HkMouse *hook = HkMouse::hooks;
631 LRESULT rc;
632
633 while(hook != NULL) {
634 if(hook->fRecursive == FALSE) {
635 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
636 hook->fRecursive = TRUE;
637 rc = hook->pCallback(code, wParam, lParam);
638 hook->fRecursive = FALSE;
639 return(rc);
640 }
641 }
642 hook = hook->next;
643 }
644 return(0);
645}
646//******************************************************************************
647//******************************************************************************
648HkMouse *HkMouse::hooks = NULL;
649
650//******************************************************************************
651//HkKeyboard class
652//******************************************************************************
653HkKeyboard::HkKeyboard(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
654{
655 //Insert it in front of the rest
656 next = hooks;
657 hooks = this;
658
659 pCallback = pUserCallback;
660 hhook = hook;
661 this->hinst = hinst;
662 this->dwThreadId = dwThreadId;
663 fRecursive = FALSE;
664}
665//******************************************************************************
666//******************************************************************************
667HkKeyboard::~HkKeyboard()
668{
669 HkKeyboard *hook = HkKeyboard::hooks;
670
671 if(hook == this) {
672 hooks = next;
673 }
674 else {
675 while(hook->next != NULL) {
676 if(hook->next == this) {
677 hook->next = next;
678 break;
679 }
680 hook = hook->next;
681 }
682 }
683}
684//******************************************************************************
685//******************************************************************************
686HOOKPROC_O32 HkKeyboard::GetOS2Hook()
687{
688 return(OS2HkKeyboardProc);
689}
690//******************************************************************************
691//******************************************************************************
692BOOL HkKeyboard::UnHookWindowsHook(HHOOK hhook)
693{
694 HkKeyboard *hook = HkKeyboard::hooks;
695
696 while(hook != NULL) {
697 if(hook->hhook == hhook) {
698 delete hook;
699 return(TRUE);
700 }
701 hook = hook->next;
702 }
703 return(FALSE);
704}
705//******************************************************************************
706//******************************************************************************
707HHOOK HkKeyboard::FindHookProc(HOOKPROC hkprc)
708{
709 HkKeyboard *hook = HkKeyboard::hooks;
710
711 while(hook != NULL) {
712 if(hook->pCallback == hkprc) {
713 return(hook->hhook);
714 }
715 hook = hook->next;
716 }
717#ifdef DEBUG
718 WriteLog("HkKeyboard::FindHookProc, couldn't find proc %X\n", hkprc);
719#endif
720 return(NULL);
721}
722//******************************************************************************
723//******************************************************************************
724static LRESULT OS2HkKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
725{
726 HkKeyboard *hook = HkKeyboard::hooks;
727 LRESULT rc;
728
729 while(hook != NULL) {
730 if(hook->fRecursive == FALSE) {
731 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
732 hook->fRecursive = TRUE;
733 rc = hook->pCallback(code, wParam, lParam);
734 hook->fRecursive = FALSE;
735 return(rc);
736 }
737 }
738 hook = hook->next;
739 }
740 return(0);
741}
742//******************************************************************************
743//******************************************************************************
744HkKeyboard *HkKeyboard::hooks = NULL;
745
746//******************************************************************************
747//HkMsgFilter class
748//******************************************************************************
749HkMsgFilter::HkMsgFilter(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
750{
751 //Insert it in front of the rest
752 next = hooks;
753 hooks = this;
754
755 pCallback = pUserCallback;
756 hhook = hook;
757 this->hinst = hinst;
758 this->dwThreadId = dwThreadId;
759 fRecursive = FALSE;
760}
761//******************************************************************************
762//******************************************************************************
763HkMsgFilter::~HkMsgFilter()
764{
765 HkMsgFilter *hook = HkMsgFilter::hooks;
766
767 if(hook == this) {
768 hooks = next;
769 }
770 else {
771 while(hook->next != NULL) {
772 if(hook->next == this) {
773 hook->next = next;
774 break;
775 }
776 hook = hook->next;
777 }
778 }
779}
780//******************************************************************************
781//******************************************************************************
782HOOKPROC_O32 HkMsgFilter::GetOS2Hook()
783{
784 return(OS2HkMsgFilterProc);
785}
786//******************************************************************************
787//******************************************************************************
788BOOL HkMsgFilter::UnHookWindowsHook(HHOOK hhook)
789{
790 HkMsgFilter *hook = HkMsgFilter::hooks;
791
792 while(hook != NULL) {
793 if(hook->hhook == hhook) {
794 delete hook;
795 return(TRUE);
796 }
797 hook = hook->next;
798 }
799 return(FALSE);
800}
801//******************************************************************************
802//******************************************************************************
803HHOOK HkMsgFilter::FindHookProc(HOOKPROC hkprc)
804{
805 HkMsgFilter *hook = HkMsgFilter::hooks;
806
807 while(hook != NULL) {
808 if(hook->pCallback == hkprc) {
809 return(hook->hhook);
810 }
811 hook = hook->next;
812 }
813#ifdef DEBUG
814 WriteLog("HkMsgFilter::FindHookProc, couldn't find proc %X\n", hkprc);
815#endif
816 return(NULL);
817}
818//******************************************************************************
819//******************************************************************************
820static LRESULT OS2HkMsgFilterProc(int code, WPARAM wParam, LPARAM lParam)
821{
822 HkMsgFilter *hook = HkMsgFilter::hooks;
823 LRESULT rc;
824
825#ifdef DEBUG
826 WriteLog("MsgFilterProc\n");
827#endif
828 while(hook != NULL) {
829 if(hook->fRecursive == FALSE) {
830 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
831 hook->fRecursive = TRUE;
832 rc = hook->pCallback(code, wParam, lParam);
833 hook->fRecursive = FALSE;
834 return(rc);
835 }
836 }
837 hook = hook->next;
838 }
839 return(0);
840}
841//******************************************************************************
842//******************************************************************************
843HkMsgFilter *HkMsgFilter::hooks = NULL;
844
845//******************************************************************************
846//HkSysMsgFilter class
847//******************************************************************************
848HkSysMsgFilter::HkSysMsgFilter(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
849{
850 //Insert it in front of the rest
851 next = hooks;
852 hooks = this;
853
854 pCallback = pUserCallback;
855 hhook = hook;
856 this->hinst = hinst;
857 this->dwThreadId = dwThreadId;
858 fRecursive = FALSE;
859}
860//******************************************************************************
861//******************************************************************************
862HkSysMsgFilter::~HkSysMsgFilter()
863{
864 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
865
866 if(hook == this) {
867 hooks = next;
868 }
869 else {
870 while(hook->next != NULL) {
871 if(hook->next == this) {
872 hook->next = next;
873 break;
874 }
875 hook = hook->next;
876 }
877 }
878}
879//******************************************************************************
880//******************************************************************************
881HOOKPROC_O32 HkSysMsgFilter::GetOS2Hook()
882{
883 return(OS2HkSysMsgFilterProc);
884}
885//******************************************************************************
886//******************************************************************************
887BOOL HkSysMsgFilter::UnHookWindowsHook(HHOOK hhook)
888{
889 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
890
891 while(hook != NULL) {
892 if(hook->hhook == hhook) {
893 delete hook;
894 return(TRUE);
895 }
896 hook = hook->next;
897 }
898 return(FALSE);
899}
900//******************************************************************************
901//******************************************************************************
902HHOOK HkSysMsgFilter::FindHookProc(HOOKPROC hkprc)
903{
904 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
905
906 while(hook != NULL) {
907 if(hook->pCallback == hkprc) {
908 return(hook->hhook);
909 }
910 hook = hook->next;
911 }
912#ifdef DEBUG
913 WriteLog("HkSysMsgFilter::FindHookProc, couldn't find proc %X\n", hkprc);
914#endif
915 return(NULL);
916}
917//******************************************************************************
918//******************************************************************************
919static LRESULT OS2HkSysMsgFilterProc(int code, WPARAM wParam, LPARAM lParam)
920{
921 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
922 LRESULT rc;
923
924 while(hook != NULL) {
925 if(hook->fRecursive == FALSE) {
926 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
927 hook->fRecursive = TRUE;
928 rc = hook->pCallback(code, wParam, lParam);
929 hook->fRecursive = FALSE;
930 return(rc);
931 }
932 }
933 hook = hook->next;
934 }
935 return(0);
936}
937//******************************************************************************
938//******************************************************************************
939HkSysMsgFilter *HkSysMsgFilter::hooks = NULL;
940
941//******************************************************************************
942//HkShell class
943//******************************************************************************
944HkShell::HkShell(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
945{
946 //Insert it in front of the rest
947 next = hooks;
948 hooks = this;
949
950 pCallback = pUserCallback;
951 hhook = hook;
952 this->hinst = hinst;
953 this->dwThreadId = dwThreadId;
954 fRecursive = FALSE;
955}
956//******************************************************************************
957//******************************************************************************
958HkShell::~HkShell()
959{
960 HkShell *hook = HkShell::hooks;
961
962 if(hook == this) {
963 hooks = next;
964 }
965 else {
966 while(hook->next != NULL) {
967 if(hook->next == this) {
968 hook->next = next;
969 break;
970 }
971 hook = hook->next;
972 }
973 }
974}
975//******************************************************************************
976//******************************************************************************
977HOOKPROC_O32 HkShell::GetOS2Hook()
978{
979 return(OS2HkShellProc);
980}
981//******************************************************************************
982//******************************************************************************
983BOOL HkShell::UnHookWindowsHook(HHOOK hhook)
984{
985 HkShell *hook = HkShell::hooks;
986
987 while(hook != NULL) {
988 if(hook->hhook == hhook) {
989 delete hook;
990 return(TRUE);
991 }
992 hook = hook->next;
993 }
994 return(FALSE);
995}
996//******************************************************************************
997//******************************************************************************
998HHOOK HkShell::FindHookProc(HOOKPROC hkprc)
999{
1000 HkShell *hook = HkShell::hooks;
1001
1002 while(hook != NULL) {
1003 if(hook->pCallback == hkprc) {
1004 return(hook->hhook);
1005 }
1006 hook = hook->next;
1007 }
1008#ifdef DEBUG
1009 WriteLog("HkShell::FindHookProc, couldn't find proc %X\n", hkprc);
1010#endif
1011 return(NULL);
1012}
1013//******************************************************************************
1014//******************************************************************************
1015static LRESULT OS2HkShellProc(int code, WPARAM wParam, LPARAM lParam)
1016{
1017 HkShell *hook = HkShell::hooks;
1018 LRESULT rc;
1019
1020 while(hook != NULL) {
1021 if(hook->fRecursive == FALSE) {
1022 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1023 hook->fRecursive = TRUE;
1024 rc = hook->pCallback(code, wParam, lParam);
1025 hook->fRecursive = FALSE;
1026 return(rc);
1027 }
1028 }
1029 hook = hook->next;
1030 }
1031 return(0);
1032}
1033//******************************************************************************
1034//******************************************************************************
1035HkShell *HkShell::hooks = NULL;
1036
1037//******************************************************************************
1038//HkJrnlPlayback class
1039//******************************************************************************
1040HkJrnlPlayback::HkJrnlPlayback(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
1041{
1042 //Insert it in front of the rest
1043 next = hooks;
1044 hooks = this;
1045
1046 pCallback = pUserCallback;
1047 hhook = hook;
1048 this->hinst = hinst;
1049 this->dwThreadId = dwThreadId;
1050 fRecursive = FALSE;
1051}
1052//******************************************************************************
1053//******************************************************************************
1054HkJrnlPlayback::~HkJrnlPlayback()
1055{
1056 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1057
1058 if(hook == this) {
1059 hooks = next;
1060 }
1061 else {
1062 while(hook->next != NULL) {
1063 if(hook->next == this) {
1064 hook->next = next;
1065 break;
1066 }
1067 hook = hook->next;
1068 }
1069 }
1070}
1071//******************************************************************************
1072//******************************************************************************
1073HOOKPROC_O32 HkJrnlPlayback::GetOS2Hook()
1074{
1075 return(OS2HkJrnlPlaybackProc);
1076}
1077//******************************************************************************
1078//******************************************************************************
1079BOOL HkJrnlPlayback::UnHookWindowsHook(HHOOK hhook)
1080{
1081 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1082
1083 while(hook != NULL) {
1084 if(hook->hhook == hhook) {
1085 delete hook;
1086 return(TRUE);
1087 }
1088 hook = hook->next;
1089 }
1090 return(FALSE);
1091}
1092//******************************************************************************
1093//******************************************************************************
1094HHOOK HkJrnlPlayback::FindHookProc(HOOKPROC hkprc)
1095{
1096 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1097
1098 while(hook != NULL) {
1099 if(hook->pCallback == hkprc) {
1100 return(hook->hhook);
1101 }
1102 hook = hook->next;
1103 }
1104#ifdef DEBUG
1105 WriteLog("HkJrnlPlayback::FindHookProc, couldn't find proc %X\n", hkprc);
1106#endif
1107 return(NULL);
1108}
1109//******************************************************************************
1110//******************************************************************************
1111static LRESULT OS2HkJrnlPlaybackProc(int code, WPARAM wParam, LPARAM lParam)
1112{
1113 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1114 LRESULT rc;
1115
1116 while(hook != NULL) {
1117 if(hook->fRecursive == FALSE) {
1118 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1119 hook->fRecursive = TRUE;
1120 rc = hook->pCallback(code, wParam, lParam);
1121 hook->fRecursive = FALSE;
1122 return(rc);
1123 }
1124 }
1125 hook = hook->next;
1126 }
1127 return(0);
1128}
1129//******************************************************************************
1130//******************************************************************************
1131HkJrnlPlayback *HkJrnlPlayback::hooks = NULL;
1132
1133//******************************************************************************
1134//HkJrnlRecord class
1135//******************************************************************************
1136HkJrnlRecord::HkJrnlRecord(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
1137{
1138 //Insert it in front of the rest
1139 next = hooks;
1140 hooks = this;
1141
1142 pCallback = pUserCallback;
1143 hhook = hook;
1144 this->hinst = hinst;
1145 this->dwThreadId = dwThreadId;
1146 fRecursive = FALSE;
1147}
1148//******************************************************************************
1149//******************************************************************************
1150HkJrnlRecord::~HkJrnlRecord()
1151{
1152 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1153
1154 if(hook == this) {
1155 hooks = next;
1156 }
1157 else {
1158 while(hook->next != NULL) {
1159 if(hook->next == this) {
1160 hook->next = next;
1161 break;
1162 }
1163 hook = hook->next;
1164 }
1165 }
1166}
1167//******************************************************************************
1168//******************************************************************************
1169HOOKPROC_O32 HkJrnlRecord::GetOS2Hook()
1170{
1171 return(OS2HkJrnlRecordProc);
1172}
1173//******************************************************************************
1174//******************************************************************************
1175BOOL HkJrnlRecord::UnHookWindowsHook(HHOOK hhook)
1176{
1177 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1178
1179 while(hook != NULL) {
1180 if(hook->hhook == hhook) {
1181 delete hook;
1182 return(TRUE);
1183 }
1184 hook = hook->next;
1185 }
1186 return(FALSE);
1187}
1188//******************************************************************************
1189//******************************************************************************
1190HHOOK HkJrnlRecord::FindHookProc(HOOKPROC hkprc)
1191{
1192 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1193
1194 while(hook != NULL) {
1195 if(hook->pCallback == hkprc) {
1196 return(hook->hhook);
1197 }
1198 hook = hook->next;
1199 }
1200#ifdef DEBUG
1201 WriteLog("HkJrnlRecord::FindHookProc, couldn't find proc %X\n", hkprc);
1202#endif
1203 return(NULL);
1204}
1205//******************************************************************************
1206//******************************************************************************
1207static LRESULT OS2HkJrnlRecordProc(int code, WPARAM wParam, LPARAM lParam)
1208{
1209 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1210 LRESULT rc;
1211
1212 while(hook != NULL) {
1213 if(hook->fRecursive == FALSE) {
1214 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1215 hook->fRecursive = TRUE;
1216 rc = hook->pCallback(code, wParam, lParam);
1217 hook->fRecursive = FALSE;
1218 return(rc);
1219 }
1220 }
1221 hook = hook->next;
1222 }
1223 return(0);
1224}
1225//******************************************************************************
1226//******************************************************************************
1227HkJrnlRecord *HkJrnlRecord::hooks = NULL;
1228
Note: See TracBrowser for help on using the repository browser.