Changeset 2768 for trunk/src/user32/HOOK.CPP
- Timestamp:
- Feb 12, 2000, 7:09:50 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/HOOK.CPP
r2469 r2768 1 /* $Id: HOOK.CPP,v 1. 9 2000-01-18 20:10:30 sandervlExp $ */1 /* $Id: HOOK.CPP,v 1.10 2000-02-12 18:09:49 cbratschi Exp $ */ 2 2 3 3 /* … … 27 27 #include <os2win.h> 28 28 #include "hook.h" 29 #include "win.h"30 29 #include "queue.h" 31 30 #include "task.h" … … 70 69 typedef VOID (*HOOK_MapFunc)(INT, INT, WPARAM *, LPARAM *); 71 70 typedef VOID (*HOOK_UnMapFunc)(INT, INT, WPARAM, LPARAM, WPARAM, 72 71 LPARAM); 73 72 74 73 /*********************************************************************** … … 76 75 */ 77 76 static void HOOK_Map32ATo32W(INT id, INT code, WPARAM *pwParam, 78 77 LPARAM *plParam) 79 78 { 80 79 if (id == WH_CBT && code == HCBT_CREATEWND) 81 80 { 82 83 84 85 86 87 88 89 90 91 92 81 LPCBT_CREATEWNDA lpcbtcwA = (LPCBT_CREATEWNDA)*plParam; 82 LPCBT_CREATEWNDW lpcbtcwW = (LPCBT_CREATEWNDW)HeapAlloc(GetProcessHeap(), 0, 83 sizeof(*lpcbtcwW) ); 84 lpcbtcwW->lpcs = (CREATESTRUCTW*)HeapAlloc( GetProcessHeap(), 0, sizeof(*lpcbtcwW->lpcs) ); 85 86 lpcbtcwW->hwndInsertAfter = lpcbtcwA->hwndInsertAfter; 87 *lpcbtcwW->lpcs = *(LPCREATESTRUCTW)lpcbtcwA->lpcs; 88 89 if (HIWORD(lpcbtcwA->lpcs->lpszName)) 90 { 91 lpcbtcwW->lpcs->lpszName = HEAP_strdupAtoW( GetProcessHeap(), 0, 93 92 lpcbtcwA->lpcs->lpszName ); 94 95 96 97 98 99 100 93 } 94 else 95 lpcbtcwW->lpcs->lpszName = (LPWSTR)lpcbtcwA->lpcs->lpszName; 96 97 if (HIWORD(lpcbtcwA->lpcs->lpszClass)) 98 { 99 lpcbtcwW->lpcs->lpszClass = HEAP_strdupAtoW( GetProcessHeap(), 0, 101 100 lpcbtcwA->lpcs->lpszClass ); 102 103 104 105 101 } 102 else 103 lpcbtcwW->lpcs->lpszClass = (LPCWSTR)lpcbtcwA->lpcs->lpszClass; 104 *plParam = (LPARAM)lpcbtcwW; 106 105 } 107 106 return; … … 113 112 */ 114 113 static void HOOK_UnMap32ATo32W(INT id, INT code, WPARAM wParamOrig, 115 116 114 LPARAM lParamOrig, WPARAM wParam, 115 LPARAM lParam) 117 116 { 118 117 if (id == WH_CBT && code == HCBT_CREATEWND) 119 118 { 120 121 119 LPCBT_CREATEWNDW lpcbtcwW = (LPCBT_CREATEWNDW)lParam; 120 if (HIWORD(lpcbtcwW->lpcs->lpszName)) 122 121 HeapFree( GetProcessHeap(), 0, (LPWSTR)lpcbtcwW->lpcs->lpszName ); 123 122 if (HIWORD(lpcbtcwW->lpcs->lpszClass)) 124 123 HeapFree( GetProcessHeap(), 0, (LPWSTR)lpcbtcwW->lpcs->lpszClass ); 125 126 124 HeapFree( GetProcessHeap(), 0, lpcbtcwW->lpcs ); 125 HeapFree( GetProcessHeap(), 0, lpcbtcwW ); 127 126 } 128 127 return; … … 134 133 */ 135 134 static void HOOK_Map32WTo32A(INT id, INT code, WPARAM *pwParam, 136 135 LPARAM *plParam) 137 136 { 138 137 if (id == WH_CBT && code == HCBT_CREATEWND) 139 138 { 140 141 142 143 144 145 146 147 148 149 139 LPCBT_CREATEWNDW lpcbtcwW = (LPCBT_CREATEWNDW)*plParam; 140 LPCBT_CREATEWNDA lpcbtcwA = (LPCBT_CREATEWNDA)HeapAlloc(GetProcessHeap(), 0, 141 sizeof(*lpcbtcwA) ); 142 lpcbtcwA->lpcs = (CREATESTRUCTA*)HeapAlloc( GetProcessHeap(), 0, sizeof(*lpcbtcwA->lpcs) ); 143 144 lpcbtcwA->hwndInsertAfter = lpcbtcwW->hwndInsertAfter; 145 *lpcbtcwA->lpcs = *(LPCREATESTRUCTA)lpcbtcwW->lpcs; 146 147 if (HIWORD(lpcbtcwW->lpcs->lpszName)) 148 lpcbtcwA->lpcs->lpszName = HEAP_strdupWtoA( GetProcessHeap(), 0, 150 149 lpcbtcwW->lpcs->lpszName ); 151 152 153 154 155 150 else 151 lpcbtcwA->lpcs->lpszName = (LPSTR)lpcbtcwW->lpcs->lpszName; 152 153 if (HIWORD(lpcbtcwW->lpcs->lpszClass)) 154 lpcbtcwA->lpcs->lpszClass = HEAP_strdupWtoA( GetProcessHeap(), 0, 156 155 lpcbtcwW->lpcs->lpszClass ); 157 158 159 156 else 157 lpcbtcwA->lpcs->lpszClass = (LPSTR)lpcbtcwW->lpcs->lpszClass; 158 *plParam = (LPARAM)lpcbtcwA; 160 159 } 161 160 return; … … 167 166 */ 168 167 static void HOOK_UnMap32WTo32A(INT id, INT code, WPARAM wParamOrig, 169 170 168 LPARAM lParamOrig, WPARAM wParam, 169 LPARAM lParam) 171 170 { 172 171 if (id == WH_CBT && code == HCBT_CREATEWND) 173 172 { 174 175 173 LPCBT_CREATEWNDA lpcbtcwA = (LPCBT_CREATEWNDA)lParam; 174 if (HIWORD(lpcbtcwA->lpcs->lpszName)) 176 175 HeapFree( GetProcessHeap(), 0, (LPSTR)lpcbtcwA->lpcs->lpszName ); 177 176 if (HIWORD(lpcbtcwA->lpcs->lpszClass)) 178 177 HeapFree( GetProcessHeap(), 0, (LPSTR)lpcbtcwA->lpcs->lpszClass ); 179 180 178 HeapFree( GetProcessHeap(), 0, lpcbtcwA->lpcs ); 179 HeapFree( GetProcessHeap(), 0, lpcbtcwA ); 181 180 } 182 181 return; … … 187 186 * Map Function Tables 188 187 */ 189 static const HOOK_MapFunc HOOK_MapFuncs[3][3] = 188 static const HOOK_MapFunc HOOK_MapFuncs[3][3] = 190 189 { 191 190 { NULL, NULL, NULL }, … … 194 193 }; 195 194 196 static const HOOK_UnMapFunc HOOK_UnMapFuncs[3][3] = 195 static const HOOK_UnMapFunc HOOK_UnMapFuncs[3][3] = 197 196 { 198 197 { NULL, NULL, NULL }, … … 234 233 HANDLE hook = 0; 235 234 THDB *thdb; 236 235 237 236 thdb = GetTHDBFromThreadId(threadId); 238 237 if(thdb) { 239 238 hook = thdb->hooks[id - WH_MINHOOK]; 240 239 } 241 240 if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK]; … … 251 250 */ 252 251 static HHOOK HOOK_SetHook( INT id, LPVOID proc, INT type, 253 252 HMODULE hModule, DWORD dwThreadId ) 254 253 { 255 254 HOOKDATA *data; 256 255 THDB *thdb; 257 256 258 257 if ((id < WH_MINHOOK) || (id > WH_MAXHOOK) || !proc ) 259 258 { 260 259 SetLastError(ERROR_INVALID_PARAMETER); 261 260 return 0; 262 261 } … … 275 274 if (dwThreadId) /* Task-specific hook */ 276 275 { 277 278 279 280 281 276 if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) || 277 (id == WH_SYSMSGFILTER)) { 278 SetLastError(ERROR_INVALID_PARAMETER); 279 return 0; /* System-only hooks */ 280 } 282 281 } 283 282 … … 295 294 if(dwThreadId) 296 295 { 297 298 299 300 301 302 296 thdb = GetTHDBFromThreadId(dwThreadId); 297 if(!thdb) { 298 dprintf(("HOOK_SetHook: can't find thread database for thread %x", dwThreadId)); 299 return 0; 300 } 301 threadHookMutex.enter(); 303 302 data->next = thdb->hooks[id - WH_MINHOOK]; 304 303 thdb->hooks[id - WH_MINHOOK] = (DWORD)data; 305 304 threadHookMutex.leave(); 306 305 } 307 306 else 308 307 { 309 308 systemHookMutex.enter(); 310 309 data->next = HOOK_systemHooks[id - WH_MINHOOK]; 311 310 HOOK_systemHooks[id - WH_MINHOOK] = (HANDLE)data; 312 311 systemHookMutex.leave(); 313 312 } 314 313 … … 329 328 330 329 dprintf(("Removing hook %08x\n", data)); 331 330 332 331 if (data->flags & HOOK_INUSE) 333 332 { … … 341 340 if (data->id == WH_JOURNALPLAYBACK) EnableHardwareInput16(TRUE); 342 341 #endif 343 342 344 343 /* Remove it from the linked list */ 345 344 346 345 if (data->ownerThread) 347 346 { 348 349 350 351 352 353 354 347 thdb = GetTHDBFromThreadId(data->ownerThread); 348 if(!thdb) { 349 dprintf(("HOOK_RemoveHook: can't find thread database for thread %x", data->ownerThread)); 350 return FALSE; 351 } 352 hookMutex = &threadHookMutex; 353 hookMutex->enter(); 355 354 prevHook = (HOOKDATA **)&thdb->hooks[data->id - WH_MINHOOK]; 356 355 } 357 356 else { 358 359 360 357 hookMutex = &systemHookMutex; 358 hookMutex->enter(); 359 prevHook = (HOOKDATA **)&HOOK_systemHooks[data->id - WH_MINHOOK]; 361 360 } 362 361 while (*prevHook && *prevHook != data) … … 364 363 365 364 if (!prevHook) { 366 367 365 hookMutex->leave(); 366 return FALSE; 368 367 } 369 368 *prevHook = (HOOKDATA *)data->next; … … 384 383 for (;;) 385 384 { 386 387 388 385 if (!(data = (HOOKDATA *)hook)) return 0; 386 if (data->proc) return hook; 387 hook = data->next; 389 388 } 390 389 } … … 444 443 BOOL HOOK_IsHooked( INT id ) 445 444 { 446 /* Hmmm. Use GetThreadQueue(0) instead of GetFastQueue() here to 445 /* Hmmm. Use GetThreadQueue(0) instead of GetFastQueue() here to 447 446 avoid queue being created if someone wants to merely check ... */ 448 447 … … 458 457 LPARAM lParam ) 459 458 { 460 HANDLE hook; 459 HANDLE hook; 461 460 462 461 if (!(hook = HOOK_GetHook( id, GetCurrentThreadId() ))) return 0; … … 473 472 LPARAM lParam ) 474 473 { 475 HANDLE hook; 474 HANDLE hook; 476 475 477 476 if (!(hook = HOOK_GetHook( id, GetCurrentThreadId() ))) return 0; 478 477 if (!(hook = HOOK_FindValidHook(hook))) return 0; 479 478 return HOOK_CallHook( hook, HOOK_WIN32W, code, wParam, 480 479 lParam ); 481 480 } 482 481 … … 492 491 if ((queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue )) != NULL) 493 492 { 494 HOOKDATA*data;495 HHOOKhook;496 intid;497 498 499 500 501 502 503 504 505 506 507 508 493 HOOKDATA* data; 494 HHOOK hook; 495 int id; 496 for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ ) 497 { 498 hook = queue->hooks[id - WH_MINHOOK]; 499 while( hook ) 500 { 501 if( (data = (HOOKDATA *)hook) ) 502 { 503 data->ownerQueue = hQueue; 504 hook = data->next; 505 } else break; 506 } 507 } 509 508 510 509 QUEUE_Unlock( queue ); … … 514 513 515 514 /*********************************************************************** 516 * 515 * HOOK_FreeModuleHooks 517 516 */ 518 517 void HOOK_FreeModuleHooks( HMODULE hModule ) … … 528 527 hook = HOOK_systemHooks[id - WH_MINHOOK]; 529 528 while( hook ) 530 if( (hptr = (HOOKDATA *)hook) ) 531 { 532 next = hptr->next; 533 if( hptr->ownerModule == hModule ) 529 { 530 hptr = (HOOKDATA *)hook; 531 if (hptr) 532 { 533 next = hptr->next; 534 if( hptr->ownerModule == hModule ) 534 535 { 535 536 hptr->flags &= HOOK_MAPTYPE; 536 537 HOOK_RemoveHook(hptr); 537 538 } 538 hook = next; 539 } 540 else hook = 0; 541 } 542 } 543 544 /*********************************************************************** 545 * HOOK_FreeQueueHooks 539 hook = next; 540 } 541 else hook = 0; 542 } 543 } 544 } 545 546 /*********************************************************************** 547 * HOOK_FreeQueueHooks 546 548 */ 547 549 void HOOK_FreeQueueHooks( DWORD threadId ) … … 549 551 /* remove all hooks registered by this queue */ 550 552 551 HOOKDATA* 552 HHOOK 553 int 553 HOOKDATA* hptr = NULL; 554 HHOOK hook, next; 555 int id; 554 556 555 557 for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ ) … … 557 559 hook = HOOK_GetHook( id, threadId ); 558 560 while( hook ) 559 560 561 562 563 564 565 566 567 568 569 561 { 562 next = HOOK_GetNextHook(hook); 563 564 hptr = (HOOKDATA *)hook; 565 if( hptr && hptr->ownerThread == threadId ) 566 { 567 hptr->flags &= HOOK_MAPTYPE; 568 HOOK_RemoveHook(hptr); 569 } 570 hook = next; 571 } 570 572 } 571 573 } … … 632 634 { 633 635 if (CHECK_MAGIC(hhook) == FALSE) 634 636 return FALSE; 635 637 636 638 return HOOK_RemoveHook( (HOOKDATA *)hhook ); … … 646 648 { 647 649 HANDLE next; 648 INT fromtype; 650 INT fromtype; /* figure out Ansi/Unicode */ 649 651 HOOKDATA *oldhook; 650 652 651 653 if (CHECK_MAGIC(hhook) == FALSE) 652 654 return FALSE; 653 655 654 656 if (!(next = HOOK_GetNextHook( hhook ))) return 0; … … 670 672 BOOL WINAPI CallMsgFilterA( LPMSG msg, INT code ) 671 673 { 672 if (GetSysModalWindow()) return FALSE; /* ??? */ 674 #if 0 //CB: not a Win32 API and unimplemented 675 if (GetSysModalWindow()) return FALSE; /* ??? */ 676 #endif 673 677 if (HOOK_CallHooksA( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) 674 678 return TRUE; … … 682 686 BOOL WINAPI CallMsgFilterW( LPMSG msg, INT code ) 683 687 { 684 if (GetSysModalWindow()) return FALSE; /* ??? */ 688 #if 0 //CB: not a Win32 API and unimplemented 689 if (GetSysModalWindow()) return FALSE; /* ??? */ 690 #endif 685 691 if (HOOK_CallHooksW( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) 686 692 return TRUE;
Note:
See TracChangeset
for help on using the changeset viewer.