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

Last change on this file since 46 was 46, checked in by sandervl, 26 years ago

* empty log message *

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