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

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

hook + scrollbar bugfixes

File size: 35.1 KB
Line 
1/* $Id: hooks.cpp,v 1.6 1999-10-15 09:26:21 sandervl 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//SvL: Only send it once during WM_NCCREATE
250#if 0
251 case WM_INITDIALOG:
252#ifdef DEBUG
253 WriteLog("HkCBT: WM_INITDIALOG\n");
254#endif
255 createwnd.lpcs = &dlgcs;
256 createwnd.hwndInsertAfter = GetParent(hwnd); //TODO: not correct
257 return(pCallback(HCBT_CREATEWND, hwnd, (LPARAM)&createwnd));
258 case WM_MDICREATE:
259#ifdef DEBUG
260 WriteLog("HkCBT: WM_MDICREATE\n");
261#endif
262 createwnd.lpcs = (CREATESTRUCTA *)lParam; //==CLIENTCREATESTRUCT *
263 createwnd.hwndInsertAfter = GetParent(hwnd); //TODO: not correct
264 return(pCallback(HCBT_CREATEWND, hwnd, (LPARAM)&createwnd));
265#endif
266
267// case WM_DESTROY:
268 case WM_NCDESTROY:
269#ifdef DEBUG
270 WriteLog("HkCBT: WM_DESTROY\n");
271#endif
272 return(pCallback(HCBT_DESTROYWND, hwnd, 0));
273// case WM_ACTIVATE:
274 case WM_NCACTIVATE:
275#ifdef DEBUG
276 WriteLog("HkCBT: WM_ACTIVATE\n");
277#endif
278 activate.fMouse = (LOWORD(wParam) == WA_CLICKACTIVE);
279 if(LOWORD(wParam) == WA_INACTIVE) {
280 active = lParam;
281 inactive = hwnd;
282 }
283 else {
284 active = hwnd;
285 inactive = lParam;
286 }
287 activate.hWndActive = active;
288 return(pCallback(HCBT_ACTIVATE, inactive, (LPARAM)&activate));
289 case WM_SETFOCUS:
290#ifdef DEBUG
291 WriteLog("HkCBT: WM_SETFOCUS\n");
292#endif
293 return(pCallback(HCBT_SETFOCUS, hwnd, wParam));
294 case WM_MOVE:
295#ifdef DEBUG
296 WriteLog("HkCBT: WM_MOVE\n");
297#endif
298 GetWindowRect(hwnd, &rect);
299 rect.left = LOWORD(lParam);
300 rect.top = HIWORD(lParam);
301 return(pCallback(HCBT_MOVESIZE, hwnd, (LPARAM)&rect));
302 case WM_SIZE:
303#ifdef DEBUG
304 WriteLog("HkCBT: WM_SIZE\n");
305#endif
306 switch(wParam) {
307 case SIZE_MINIMIZED: //TODO:not correct
308 return(pCallback(HCBT_MINMAX, hwnd, SW_SHOWMINIMIZED));
309 case SIZE_MAXIMIZED: //TODO:not correct
310 return(pCallback(HCBT_MINMAX, hwnd, SW_SHOWMAXIMIZED));
311 case SIZE_RESTORED:
312 GetWindowRect(hwnd, &rect);
313 rect.right = rect.left + LOWORD(lParam); //== new width
314 rect.bottom = rect.top - HIWORD(lParam); //== new height
315 return(pCallback(HCBT_MOVESIZE, hwnd, (LPARAM)&rect));
316 }
317 case WM_QUEUESYNC:
318#ifdef DEBUG
319 WriteLog("HkCBT: WM_QUEUESYNC\n");
320#endif
321 return(pCallback(HCBT_QS, 0, 0));
322 case WM_SYSCOMMAND:
323#ifdef DEBUG
324 WriteLog("HkCBT: WM_SYSCOMMAND\n");
325#endif
326 return(pCallback(HCBT_SYSCOMMAND, wParam, lParam));
327#ifdef DEBUG1
328 default:
329 WriteLog("HkCBT: Other msg %X\n", message);
330 break;
331#endif
332
333//TODO: HCBT_KEYSKIPPED & HCBT_CLICKSKIPPED
334 }
335 return(0);
336}
337//******************************************************************************
338//******************************************************************************
339HkCBT *HkCBT::FindHook(HHOOK hhook)
340{
341 HkCBT *hook = HkCBT::hooks;
342
343 while(hook != NULL) {
344 if(hook->hhook == hhook) {
345 return(hook);
346 }
347 hook = hook->next;
348 }
349 return(NULL);
350}
351//******************************************************************************
352//******************************************************************************
353LRESULT HkCBT::CallNextHook(HHOOK hhook, int nCode, WPARAM wParam, LPARAM lParam)
354{
355 HkCBT *hkhook = (HkCBT *)hhook;
356
357 if(hkhook->next != NULL) {
358 return(hkhook->CBTCallback(hkhook->orghwnd, hkhook->orgMsg, hkhook->orgwParam, hkhook->orglParam));
359 }
360 else return(0);
361}
362//******************************************************************************
363//******************************************************************************
364HkCBT *HkCBT::hooks = NULL;
365
366//******************************************************************************
367//HkDebug class
368//******************************************************************************
369HkDebug::HkDebug(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
370{
371 //Insert it in front of the rest
372 next = hooks;
373 hooks = this;
374
375 pCallback = pUserCallback;
376 hhook = hook;
377 this->hinst = hinst;
378 this->dwThreadId = dwThreadId;
379 fRecursive = FALSE;
380}
381//******************************************************************************
382//******************************************************************************
383HkDebug::~HkDebug()
384{
385 HkDebug *hook = HkDebug::hooks;
386
387 if(hook == this) {
388 hooks = next;
389 }
390 else {
391 while(hook->next != NULL) {
392 if(hook->next == this) {
393 hook->next = next;
394 break;
395 }
396 hook = hook->next;
397 }
398 }
399}
400//******************************************************************************
401//******************************************************************************
402HOOKPROC_O32 HkDebug::GetOS2Hook()
403{
404 return(OS2HkDebugProc);
405}
406//******************************************************************************
407//******************************************************************************
408BOOL HkDebug::UnHookWindowsHook(HHOOK hhook)
409{
410 HkDebug *hook = HkDebug::hooks;
411
412 while(hook != NULL) {
413 if(hook->hhook == hhook) {
414 delete hook;
415 return(TRUE);
416 }
417 hook = hook->next;
418 }
419 return(FALSE);
420}
421//******************************************************************************
422//******************************************************************************
423HHOOK HkDebug::FindHookProc(HOOKPROC hkprc)
424{
425 HkDebug *hook = HkDebug::hooks;
426
427 while(hook != NULL) {
428 if(hook->pCallback == hkprc) {
429 return(hook->hhook);
430 }
431 hook = hook->next;
432 }
433#ifdef DEBUG
434 WriteLog("HkDebug::FindHookProc, couldn't find proc %X\n", hkprc);
435#endif
436 return(NULL);
437}
438//******************************************************************************
439//******************************************************************************
440static LRESULT OS2HkDebugProc(int code, WPARAM wParam, LPARAM lParam)
441{
442 HkDebug *hook = HkDebug::hooks;
443 LRESULT rc;
444
445 while(hook != NULL) {
446 if(hook->fRecursive == FALSE) {
447 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
448 hook->fRecursive = TRUE;
449 rc = hook->pCallback(code, wParam, lParam);
450 hook->fRecursive = FALSE;
451 return(rc);
452 }
453 }
454 hook = hook->next;
455 }
456 return(0);
457}
458//******************************************************************************
459//******************************************************************************
460HkDebug *HkDebug::hooks = NULL;
461
462//******************************************************************************
463//HkGetMessage class
464//******************************************************************************
465HkGetMessage::HkGetMessage(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
466{
467 //Insert it in front of the rest
468 next = hooks;
469 hooks = this;
470
471 pCallback = pUserCallback;
472 hhook = hook;
473 this->hinst = hinst;
474 this->dwThreadId = dwThreadId;
475 fRecursive = FALSE;
476}
477//******************************************************************************
478//******************************************************************************
479HkGetMessage::~HkGetMessage()
480{
481 HkGetMessage *hook = HkGetMessage::hooks;
482
483 if(hook == this) {
484 hooks = next;
485 }
486 else {
487 while(hook->next != NULL) {
488 if(hook->next == this) {
489 hook->next = next;
490 break;
491 }
492 hook = hook->next;
493 }
494 }
495}
496//******************************************************************************
497//******************************************************************************
498HOOKPROC_O32 HkGetMessage::GetOS2Hook()
499{
500 return(OS2HkGetMessageProc);
501}
502//******************************************************************************
503//******************************************************************************
504BOOL HkGetMessage::UnHookWindowsHook(HHOOK hhook)
505{
506 HkGetMessage *hook = HkGetMessage::hooks;
507
508 while(hook != NULL) {
509 if(hook->hhook == hhook) {
510 delete hook;
511 return(TRUE);
512 }
513 hook = hook->next;
514 }
515 return(FALSE);
516}
517//******************************************************************************
518//******************************************************************************
519HHOOK HkGetMessage::FindHookProc(HOOKPROC hkprc)
520{
521 HkGetMessage *hook = HkGetMessage::hooks;
522
523 while(hook != NULL) {
524 if(hook->pCallback == hkprc) {
525 return(hook->hhook);
526 }
527 hook = hook->next;
528 }
529#ifdef DEBUG
530 WriteLog("HkGetMessage::FindHookProc, couldn't find proc %X\n", hkprc);
531#endif
532 return(NULL);
533}
534//******************************************************************************
535//******************************************************************************
536static LRESULT OS2HkGetMessageProc(int code, WPARAM wParam, LPARAM lParam)
537{
538 HkGetMessage *hook = HkGetMessage::hooks;
539 LRESULT rc;
540
541 while(hook != NULL) {
542 if(hook->fRecursive == FALSE) {
543 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
544 hook->fRecursive = TRUE;
545 rc = hook->pCallback(code, wParam, lParam);
546 hook->fRecursive = FALSE;
547 return(rc);
548 }
549 }
550 hook = hook->next;
551 }
552 return(0);
553}
554//******************************************************************************
555//******************************************************************************
556HkGetMessage *HkGetMessage::hooks = NULL;
557
558//******************************************************************************
559//HkMouse class
560//******************************************************************************
561HkMouse::HkMouse(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
562{
563 //Insert it in front of the rest
564 next = hooks;
565 hooks = this;
566
567 pCallback = pUserCallback;
568 hhook = hook;
569 this->hinst = hinst;
570 this->dwThreadId = dwThreadId;
571 fRecursive = FALSE;
572}
573//******************************************************************************
574//******************************************************************************
575HkMouse::~HkMouse()
576{
577 HkMouse *hook = HkMouse::hooks;
578
579 if(hook == this) {
580 hooks = next;
581 }
582 else {
583 while(hook->next != NULL) {
584 if(hook->next == this) {
585 hook->next = next;
586 break;
587 }
588 hook = hook->next;
589 }
590 }
591}
592//******************************************************************************
593//******************************************************************************
594HOOKPROC_O32 HkMouse::GetOS2Hook()
595{
596 return(OS2HkMouseProc);
597}
598//******************************************************************************
599//******************************************************************************
600BOOL HkMouse::UnHookWindowsHook(HHOOK hhook)
601{
602 HkMouse *hook = HkMouse::hooks;
603
604 while(hook != NULL) {
605 if(hook->hhook == hhook) {
606 delete hook;
607 return(TRUE);
608 }
609 hook = hook->next;
610 }
611 return(FALSE);
612}
613//******************************************************************************
614//******************************************************************************
615HHOOK HkMouse::FindHookProc(HOOKPROC hkprc)
616{
617 HkMouse *hook = HkMouse::hooks;
618
619 while(hook != NULL) {
620 if(hook->pCallback == hkprc) {
621 return(hook->hhook);
622 }
623 hook = hook->next;
624 }
625#ifdef DEBUG
626 WriteLog("HkMouse::FindHookProc, couldn't find proc %X\n", hkprc);
627#endif
628 return(NULL);
629}
630//******************************************************************************
631//******************************************************************************
632static LRESULT OS2HkMouseProc(int code, WPARAM wParam, LPARAM lParam)
633{
634 HkMouse *hook = HkMouse::hooks;
635 LRESULT rc;
636
637 while(hook != NULL) {
638 if(hook->fRecursive == FALSE) {
639 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
640 hook->fRecursive = TRUE;
641 rc = hook->pCallback(code, wParam, lParam);
642 hook->fRecursive = FALSE;
643 return(rc);
644 }
645 }
646 hook = hook->next;
647 }
648 return(0);
649}
650//******************************************************************************
651//******************************************************************************
652HkMouse *HkMouse::hooks = NULL;
653
654//******************************************************************************
655//HkKeyboard class
656//******************************************************************************
657HkKeyboard::HkKeyboard(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
658{
659 //Insert it in front of the rest
660 next = hooks;
661 hooks = this;
662
663 pCallback = pUserCallback;
664 hhook = hook;
665 this->hinst = hinst;
666 this->dwThreadId = dwThreadId;
667 fRecursive = FALSE;
668}
669//******************************************************************************
670//******************************************************************************
671HkKeyboard::~HkKeyboard()
672{
673 HkKeyboard *hook = HkKeyboard::hooks;
674
675 if(hook == this) {
676 hooks = next;
677 }
678 else {
679 while(hook->next != NULL) {
680 if(hook->next == this) {
681 hook->next = next;
682 break;
683 }
684 hook = hook->next;
685 }
686 }
687}
688//******************************************************************************
689//******************************************************************************
690HOOKPROC_O32 HkKeyboard::GetOS2Hook()
691{
692 return(OS2HkKeyboardProc);
693}
694//******************************************************************************
695//******************************************************************************
696BOOL HkKeyboard::UnHookWindowsHook(HHOOK hhook)
697{
698 HkKeyboard *hook = HkKeyboard::hooks;
699
700 while(hook != NULL) {
701 if(hook->hhook == hhook) {
702 delete hook;
703 return(TRUE);
704 }
705 hook = hook->next;
706 }
707 return(FALSE);
708}
709//******************************************************************************
710//******************************************************************************
711HHOOK HkKeyboard::FindHookProc(HOOKPROC hkprc)
712{
713 HkKeyboard *hook = HkKeyboard::hooks;
714
715 while(hook != NULL) {
716 if(hook->pCallback == hkprc) {
717 return(hook->hhook);
718 }
719 hook = hook->next;
720 }
721#ifdef DEBUG
722 WriteLog("HkKeyboard::FindHookProc, couldn't find proc %X\n", hkprc);
723#endif
724 return(NULL);
725}
726//******************************************************************************
727//******************************************************************************
728static LRESULT OS2HkKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
729{
730 HkKeyboard *hook = HkKeyboard::hooks;
731 LRESULT rc;
732
733 while(hook != NULL) {
734 if(hook->fRecursive == FALSE) {
735 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
736 hook->fRecursive = TRUE;
737 rc = hook->pCallback(code, wParam, lParam);
738 hook->fRecursive = FALSE;
739 return(rc);
740 }
741 }
742 hook = hook->next;
743 }
744 return(0);
745}
746//******************************************************************************
747//******************************************************************************
748HkKeyboard *HkKeyboard::hooks = NULL;
749
750//******************************************************************************
751//HkMsgFilter class
752//******************************************************************************
753HkMsgFilter::HkMsgFilter(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
754{
755 //Insert it in front of the rest
756 next = hooks;
757 hooks = this;
758
759 pCallback = pUserCallback;
760 hhook = hook;
761 this->hinst = hinst;
762 this->dwThreadId = dwThreadId;
763 fRecursive = FALSE;
764}
765//******************************************************************************
766//******************************************************************************
767HkMsgFilter::~HkMsgFilter()
768{
769 HkMsgFilter *hook = HkMsgFilter::hooks;
770
771 if(hook == this) {
772 hooks = next;
773 }
774 else {
775 while(hook->next != NULL) {
776 if(hook->next == this) {
777 hook->next = next;
778 break;
779 }
780 hook = hook->next;
781 }
782 }
783}
784//******************************************************************************
785//******************************************************************************
786HOOKPROC_O32 HkMsgFilter::GetOS2Hook()
787{
788 return(OS2HkMsgFilterProc);
789}
790//******************************************************************************
791//******************************************************************************
792BOOL HkMsgFilter::UnHookWindowsHook(HHOOK hhook)
793{
794 HkMsgFilter *hook = HkMsgFilter::hooks;
795
796 while(hook != NULL) {
797 if(hook->hhook == hhook) {
798 delete hook;
799 return(TRUE);
800 }
801 hook = hook->next;
802 }
803 return(FALSE);
804}
805//******************************************************************************
806//******************************************************************************
807HHOOK HkMsgFilter::FindHookProc(HOOKPROC hkprc)
808{
809 HkMsgFilter *hook = HkMsgFilter::hooks;
810
811 while(hook != NULL) {
812 if(hook->pCallback == hkprc) {
813 return(hook->hhook);
814 }
815 hook = hook->next;
816 }
817#ifdef DEBUG
818 WriteLog("HkMsgFilter::FindHookProc, couldn't find proc %X\n", hkprc);
819#endif
820 return(NULL);
821}
822//******************************************************************************
823//******************************************************************************
824static LRESULT OS2HkMsgFilterProc(int code, WPARAM wParam, LPARAM lParam)
825{
826 HkMsgFilter *hook = HkMsgFilter::hooks;
827 LRESULT rc;
828
829// dprintf(("MsgFilterProc\n"));
830 while(hook != NULL) {
831 if(hook->fRecursive == FALSE) {
832 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
833 hook->fRecursive = TRUE;
834 rc = hook->pCallback(code, wParam, lParam);
835 hook->fRecursive = FALSE;
836 return(rc);
837 }
838 }
839 hook = hook->next;
840 }
841 return(0);
842}
843//******************************************************************************
844//******************************************************************************
845HkMsgFilter *HkMsgFilter::hooks = NULL;
846
847//******************************************************************************
848//HkSysMsgFilter class
849//******************************************************************************
850HkSysMsgFilter::HkSysMsgFilter(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
851{
852 //Insert it in front of the rest
853 next = hooks;
854 hooks = this;
855
856 pCallback = pUserCallback;
857 hhook = hook;
858 this->hinst = hinst;
859 this->dwThreadId = dwThreadId;
860 fRecursive = FALSE;
861}
862//******************************************************************************
863//******************************************************************************
864HkSysMsgFilter::~HkSysMsgFilter()
865{
866 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
867
868 if(hook == this) {
869 hooks = next;
870 }
871 else {
872 while(hook->next != NULL) {
873 if(hook->next == this) {
874 hook->next = next;
875 break;
876 }
877 hook = hook->next;
878 }
879 }
880}
881//******************************************************************************
882//******************************************************************************
883HOOKPROC_O32 HkSysMsgFilter::GetOS2Hook()
884{
885 return(OS2HkSysMsgFilterProc);
886}
887//******************************************************************************
888//******************************************************************************
889BOOL HkSysMsgFilter::UnHookWindowsHook(HHOOK hhook)
890{
891 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
892
893 while(hook != NULL) {
894 if(hook->hhook == hhook) {
895 delete hook;
896 return(TRUE);
897 }
898 hook = hook->next;
899 }
900 return(FALSE);
901}
902//******************************************************************************
903//******************************************************************************
904HHOOK HkSysMsgFilter::FindHookProc(HOOKPROC hkprc)
905{
906 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
907
908 while(hook != NULL) {
909 if(hook->pCallback == hkprc) {
910 return(hook->hhook);
911 }
912 hook = hook->next;
913 }
914#ifdef DEBUG
915 WriteLog("HkSysMsgFilter::FindHookProc, couldn't find proc %X\n", hkprc);
916#endif
917 return(NULL);
918}
919//******************************************************************************
920//******************************************************************************
921static LRESULT OS2HkSysMsgFilterProc(int code, WPARAM wParam, LPARAM lParam)
922{
923 HkSysMsgFilter *hook = HkSysMsgFilter::hooks;
924 LRESULT rc;
925
926 while(hook != NULL) {
927 if(hook->fRecursive == FALSE) {
928 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
929 hook->fRecursive = TRUE;
930 rc = hook->pCallback(code, wParam, lParam);
931 hook->fRecursive = FALSE;
932 return(rc);
933 }
934 }
935 hook = hook->next;
936 }
937 return(0);
938}
939//******************************************************************************
940//******************************************************************************
941HkSysMsgFilter *HkSysMsgFilter::hooks = NULL;
942
943//******************************************************************************
944//HkShell class
945//******************************************************************************
946HkShell::HkShell(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
947{
948 //Insert it in front of the rest
949 next = hooks;
950 hooks = this;
951
952 pCallback = pUserCallback;
953 hhook = hook;
954 this->hinst = hinst;
955 this->dwThreadId = dwThreadId;
956 fRecursive = FALSE;
957}
958//******************************************************************************
959//******************************************************************************
960HkShell::~HkShell()
961{
962 HkShell *hook = HkShell::hooks;
963
964 if(hook == this) {
965 hooks = next;
966 }
967 else {
968 while(hook->next != NULL) {
969 if(hook->next == this) {
970 hook->next = next;
971 break;
972 }
973 hook = hook->next;
974 }
975 }
976}
977//******************************************************************************
978//******************************************************************************
979HOOKPROC_O32 HkShell::GetOS2Hook()
980{
981 return(OS2HkShellProc);
982}
983//******************************************************************************
984//******************************************************************************
985BOOL HkShell::UnHookWindowsHook(HHOOK hhook)
986{
987 HkShell *hook = HkShell::hooks;
988
989 while(hook != NULL) {
990 if(hook->hhook == hhook) {
991 delete hook;
992 return(TRUE);
993 }
994 hook = hook->next;
995 }
996 return(FALSE);
997}
998//******************************************************************************
999//******************************************************************************
1000HHOOK HkShell::FindHookProc(HOOKPROC hkprc)
1001{
1002 HkShell *hook = HkShell::hooks;
1003
1004 while(hook != NULL) {
1005 if(hook->pCallback == hkprc) {
1006 return(hook->hhook);
1007 }
1008 hook = hook->next;
1009 }
1010#ifdef DEBUG
1011 WriteLog("HkShell::FindHookProc, couldn't find proc %X\n", hkprc);
1012#endif
1013 return(NULL);
1014}
1015//******************************************************************************
1016//******************************************************************************
1017static LRESULT OS2HkShellProc(int code, WPARAM wParam, LPARAM lParam)
1018{
1019 HkShell *hook = HkShell::hooks;
1020 LRESULT rc;
1021
1022 while(hook != NULL) {
1023 if(hook->fRecursive == FALSE) {
1024 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1025 hook->fRecursive = TRUE;
1026 rc = hook->pCallback(code, wParam, lParam);
1027 hook->fRecursive = FALSE;
1028 return(rc);
1029 }
1030 }
1031 hook = hook->next;
1032 }
1033 return(0);
1034}
1035//******************************************************************************
1036//******************************************************************************
1037HkShell *HkShell::hooks = NULL;
1038
1039//******************************************************************************
1040//HkJrnlPlayback class
1041//******************************************************************************
1042HkJrnlPlayback::HkJrnlPlayback(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
1043{
1044 //Insert it in front of the rest
1045 next = hooks;
1046 hooks = this;
1047
1048 pCallback = pUserCallback;
1049 hhook = hook;
1050 this->hinst = hinst;
1051 this->dwThreadId = dwThreadId;
1052 fRecursive = FALSE;
1053}
1054//******************************************************************************
1055//******************************************************************************
1056HkJrnlPlayback::~HkJrnlPlayback()
1057{
1058 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1059
1060 if(hook == this) {
1061 hooks = next;
1062 }
1063 else {
1064 while(hook->next != NULL) {
1065 if(hook->next == this) {
1066 hook->next = next;
1067 break;
1068 }
1069 hook = hook->next;
1070 }
1071 }
1072}
1073//******************************************************************************
1074//******************************************************************************
1075HOOKPROC_O32 HkJrnlPlayback::GetOS2Hook()
1076{
1077 return(OS2HkJrnlPlaybackProc);
1078}
1079//******************************************************************************
1080//******************************************************************************
1081BOOL HkJrnlPlayback::UnHookWindowsHook(HHOOK hhook)
1082{
1083 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1084
1085 while(hook != NULL) {
1086 if(hook->hhook == hhook) {
1087 delete hook;
1088 return(TRUE);
1089 }
1090 hook = hook->next;
1091 }
1092 return(FALSE);
1093}
1094//******************************************************************************
1095//******************************************************************************
1096HHOOK HkJrnlPlayback::FindHookProc(HOOKPROC hkprc)
1097{
1098 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1099
1100 while(hook != NULL) {
1101 if(hook->pCallback == hkprc) {
1102 return(hook->hhook);
1103 }
1104 hook = hook->next;
1105 }
1106#ifdef DEBUG
1107 WriteLog("HkJrnlPlayback::FindHookProc, couldn't find proc %X\n", hkprc);
1108#endif
1109 return(NULL);
1110}
1111//******************************************************************************
1112//******************************************************************************
1113static LRESULT OS2HkJrnlPlaybackProc(int code, WPARAM wParam, LPARAM lParam)
1114{
1115 HkJrnlPlayback *hook = HkJrnlPlayback::hooks;
1116 LRESULT rc;
1117
1118 while(hook != NULL) {
1119 if(hook->fRecursive == FALSE) {
1120 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1121 hook->fRecursive = TRUE;
1122 rc = hook->pCallback(code, wParam, lParam);
1123 hook->fRecursive = FALSE;
1124 return(rc);
1125 }
1126 }
1127 hook = hook->next;
1128 }
1129 return(0);
1130}
1131//******************************************************************************
1132//******************************************************************************
1133HkJrnlPlayback *HkJrnlPlayback::hooks = NULL;
1134
1135//******************************************************************************
1136//HkJrnlRecord class
1137//******************************************************************************
1138HkJrnlRecord::HkJrnlRecord(HHOOK hook, HOOKPROC pUserCallback, HINSTANCE hinst, DWORD dwThreadId)
1139{
1140 //Insert it in front of the rest
1141 next = hooks;
1142 hooks = this;
1143
1144 pCallback = pUserCallback;
1145 hhook = hook;
1146 this->hinst = hinst;
1147 this->dwThreadId = dwThreadId;
1148 fRecursive = FALSE;
1149}
1150//******************************************************************************
1151//******************************************************************************
1152HkJrnlRecord::~HkJrnlRecord()
1153{
1154 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1155
1156 if(hook == this) {
1157 hooks = next;
1158 }
1159 else {
1160 while(hook->next != NULL) {
1161 if(hook->next == this) {
1162 hook->next = next;
1163 break;
1164 }
1165 hook = hook->next;
1166 }
1167 }
1168}
1169//******************************************************************************
1170//******************************************************************************
1171HOOKPROC_O32 HkJrnlRecord::GetOS2Hook()
1172{
1173 return(OS2HkJrnlRecordProc);
1174}
1175//******************************************************************************
1176//******************************************************************************
1177BOOL HkJrnlRecord::UnHookWindowsHook(HHOOK hhook)
1178{
1179 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1180
1181 while(hook != NULL) {
1182 if(hook->hhook == hhook) {
1183 delete hook;
1184 return(TRUE);
1185 }
1186 hook = hook->next;
1187 }
1188 return(FALSE);
1189}
1190//******************************************************************************
1191//******************************************************************************
1192HHOOK HkJrnlRecord::FindHookProc(HOOKPROC hkprc)
1193{
1194 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1195
1196 while(hook != NULL) {
1197 if(hook->pCallback == hkprc) {
1198 return(hook->hhook);
1199 }
1200 hook = hook->next;
1201 }
1202#ifdef DEBUG
1203 WriteLog("HkJrnlRecord::FindHookProc, couldn't find proc %X\n", hkprc);
1204#endif
1205 return(NULL);
1206}
1207//******************************************************************************
1208//******************************************************************************
1209static LRESULT OS2HkJrnlRecordProc(int code, WPARAM wParam, LPARAM lParam)
1210{
1211 HkJrnlRecord *hook = HkJrnlRecord::hooks;
1212 LRESULT rc;
1213
1214 while(hook != NULL) {
1215 if(hook->fRecursive == FALSE) {
1216 if(hook->dwThreadId == 0 || hook->dwThreadId == GetCurrentThreadId()) {
1217 hook->fRecursive = TRUE;
1218 rc = hook->pCallback(code, wParam, lParam);
1219 hook->fRecursive = FALSE;
1220 return(rc);
1221 }
1222 }
1223 hook = hook->next;
1224 }
1225 return(0);
1226}
1227//******************************************************************************
1228//******************************************************************************
1229HkJrnlRecord *HkJrnlRecord::hooks = NULL;
1230
Note: See TracBrowser for help on using the repository browser.