1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS kernel 4 * PURPOSE: NtUserCallXxx call stubs 5 * FILE: win32ss/user/ntuser/simplecall.c 6 * PROGRAMERS: Ge van Geldorp (ge@gse.nl) 7 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) 8 */ 9 10 #include <win32k.h> 11 12 DBG_DEFAULT_CHANNEL(UserMisc); 13 14 /* Registered logon process ID */ 15 HANDLE gpidLogon = 0; 16 17 BOOL FASTCALL 18 co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register) 19 { 20 NTSTATUS Status; 21 PEPROCESS Process; 22 23 Status = PsLookupProcessByProcessId(ProcessId, &Process); 24 if (!NT_SUCCESS(Status)) 25 { 26 EngSetLastError(RtlNtStatusToDosError(Status)); 27 return FALSE; 28 } 29 30 ProcessId = Process->UniqueProcessId; 31 32 ObDereferenceObject(Process); 33 34 if (Register) 35 { 36 /* Register the logon process */ 37 if (gpidLogon != 0) 38 return FALSE; 39 40 gpidLogon = ProcessId; 41 } 42 else 43 { 44 /* Deregister the logon process */ 45 if (gpidLogon != ProcessId) 46 return FALSE; 47 48 gpidLogon = 0; 49 } 50 51 return TRUE; 52 } 53 54 /* 55 * @unimplemented 56 */ 57 DWORD_PTR 58 APIENTRY 59 NtUserCallNoParam(DWORD Routine) 60 { 61 DWORD_PTR Result = 0; 62 63 TRACE("Enter NtUserCallNoParam\n"); 64 UserEnterExclusive(); 65 66 switch (Routine) 67 { 68 case NOPARAM_ROUTINE_CREATEMENU: 69 Result = (DWORD_PTR)UserCreateMenu(GetW32ThreadInfo()->rpdesk, FALSE); 70 break; 71 72 case NOPARAM_ROUTINE_CREATEMENUPOPUP: 73 Result = (DWORD_PTR)UserCreateMenu(GetW32ThreadInfo()->rpdesk, TRUE); 74 break; 75 76 case NOPARAM_ROUTINE_DESTROY_CARET: 77 Result = (DWORD_PTR)co_IntDestroyCaret(PsGetCurrentThread()->Tcb.Win32Thread); 78 break; 79 80 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP: 81 Result = (DWORD_PTR)IntInitMessagePumpHook(); 82 break; 83 84 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP: 85 Result = (DWORD_PTR)IntUninitMessagePumpHook(); 86 break; 87 88 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK: 89 Result = (DWORD_PTR)IntMsqClearWakeMask(); 90 break; 91 92 case NOPARAM_ROUTINE_GETMSESSAGEPOS: 93 { 94 PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); 95 Result = (DWORD_PTR)MAKELONG(pti->ptLast.x, pti->ptLast.y); 96 break; 97 } 98 99 case NOPARAM_ROUTINE_RELEASECAPTURE: 100 Result = (DWORD_PTR)IntReleaseCapture(); 101 break; 102 103 case NOPARAM_ROUTINE_LOADUSERAPIHOOK: 104 Result = UserLoadApiHook(); 105 break; 106 107 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS: 108 { 109 PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); 110 TRACE("Zapping the Active and Focus window out of the Queue!\n"); 111 pti->MessageQueue->spwndFocus = NULL; 112 pti->MessageQueue->spwndActive = NULL; 113 Result = 0; 114 break; 115 } 116 117 /* this is a ReactOS only case and is needed for gui-on-demand */ 118 case NOPARAM_ROUTINE_ISCONSOLEMODE: 119 Result = (ScreenDeviceContext == NULL); 120 break; 121 122 case NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING: 123 gpsi->dwSRVIFlags |= SRVINFO_IMM32; // Always set. 124 Result = TRUE; // Always return TRUE. 125 break; 126 127 default: 128 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine); 129 EngSetLastError(ERROR_INVALID_PARAMETER); 130 break; 131 } 132 133 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID)Result); 134 UserLeave(); 135 136 return Result; 137 } 138 139 140 /* 141 * @implemented 142 */ 143 DWORD_PTR 144 APIENTRY 145 NtUserCallOneParam( 146 DWORD_PTR Param, 147 DWORD Routine) 148 { 149 DWORD_PTR Result; 150 151 TRACE("Enter NtUserCallOneParam\n"); 152 153 UserEnterExclusive(); 154 155 switch (Routine) 156 { 157 case ONEPARAM_ROUTINE_POSTQUITMESSAGE: 158 { 159 PTHREADINFO pti; 160 pti = PsGetCurrentThreadWin32Thread(); 161 MsqPostQuitMessage(pti, Param); 162 Result = TRUE; 163 break; 164 } 165 166 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS: 167 { 168 PSMWP psmwp; 169 HDWP hDwp = NULL; 170 INT count = (INT)Param; 171 172 if (count < 0) 173 { 174 EngSetLastError(ERROR_INVALID_PARAMETER); 175 Result = 0; 176 break; 177 } 178 179 /* Windows allows zero count, in which case it allocates context for 8 moves */ 180 if (count == 0) count = 8; 181 182 psmwp = (PSMWP)UserCreateObject(gHandleTable, 183 NULL, 184 NULL, 185 (PHANDLE)&hDwp, 186 TYPE_SETWINDOWPOS, 187 sizeof(SMWP)); 188 if (!psmwp) 189 { 190 Result = 0; 191 break; 192 } 193 194 psmwp->acvr = ExAllocatePoolWithTag(PagedPool, count * sizeof(CVR), USERTAG_SWP); 195 if (!psmwp->acvr) 196 { 197 UserDeleteObject(hDwp, TYPE_SETWINDOWPOS); 198 Result = 0; 199 break; 200 } 201 202 RtlZeroMemory(psmwp->acvr, count * sizeof(CVR)); 203 psmwp->bHandle = TRUE; 204 psmwp->ccvr = 0; // actualCount 205 psmwp->ccvrAlloc = count; // suggestedCount 206 Result = (DWORD_PTR)hDwp; 207 break; 208 } 209 210 case ONEPARAM_ROUTINE_SHOWCURSOR: 211 Result = (DWORD_PTR)UserShowCursor((BOOL)Param); 212 break; 213 214 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING: 215 { 216 PTHREADINFO ti; 217 ti = GetW32ThreadInfo(); 218 if (ti != NULL) 219 { 220 /* Try convert the pointer to a user mode pointer if the desktop is 221 mapped into the process */ 222 Result = (DWORD_PTR)DesktopHeapAddressToUser((PVOID)Param); 223 } 224 else 225 { 226 Result = 0; 227 } 228 break; 229 } 230 231 case ONEPARAM_ROUTINE_WINDOWFROMDC: 232 Result = (DWORD_PTR)IntWindowFromDC((HDC)Param); 233 break; 234 235 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON: 236 { 237 Result = gspv.bMouseBtnSwap; 238 gspv.bMouseBtnSwap = Param ? TRUE : FALSE; 239 gpsi->aiSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap; 240 break; 241 } 242 243 case ONEPARAM_ROUTINE_SETCARETBLINKTIME: 244 Result = (DWORD_PTR)IntSetCaretBlinkTime((UINT)Param); 245 break; 246 247 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO: 248 Result = (DWORD_PTR)MsqSetMessageExtraInfo((LPARAM)Param); 249 break; 250 251 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT: 252 { 253 if (!(Result = (DWORD_PTR)IntCreateCurIconHandle((DWORD)Param))) 254 { 255 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); 256 Result = 0; 257 } 258 break; 259 } 260 261 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING: 262 { 263 BOOL Enable; 264 PPROCESSINFO Process = PsGetCurrentProcessWin32Process(); 265 266 if (Process != NULL) 267 { 268 Enable = (BOOL)(Param != 0); 269 270 if (Enable) 271 { 272 Process->W32PF_flags &= ~W32PF_NOWINDOWGHOSTING; 273 } 274 else 275 { 276 Process->W32PF_flags |= W32PF_NOWINDOWGHOSTING; 277 } 278 279 Result = TRUE; 280 break; 281 } 282 283 Result = FALSE; 284 break; 285 } 286 287 case ONEPARAM_ROUTINE_GETINPUTEVENT: 288 Result = (DWORD_PTR)IntMsqSetWakeMask(Param); 289 break; 290 291 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE: 292 Result = UserGetKeyboardType(Param); 293 break; 294 295 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT: 296 Result = (DWORD_PTR)UserGetKeyboardLayout(Param); 297 break; 298 299 case ONEPARAM_ROUTINE_RELEASEDC: 300 Result = UserReleaseDC(NULL, (HDC) Param, FALSE); 301 break; 302 303 case ONEPARAM_ROUTINE_REALIZEPALETTE: 304 Result = UserRealizePalette((HDC) Param); 305 break; 306 307 case ONEPARAM_ROUTINE_GETQUEUESTATUS: 308 { 309 Result = IntGetQueueStatus((DWORD)Param); 310 break; 311 } 312 313 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS: 314 /* FIXME: Should use UserEnterShared */ 315 Result = UserEnumClipboardFormats(Param); 316 break; 317 318 case ONEPARAM_ROUTINE_GETCURSORPOS: 319 { 320 PPOINTL pptl; 321 PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); 322 Result = TRUE; 323 if (pti->rpdesk != IntGetActiveDesktop()) 324 { 325 Result = FALSE; 326 break; 327 } 328 _SEH2_TRY 329 { 330 ProbeForWrite((POINT*)Param,sizeof(POINT),1); 331 pptl = (PPOINTL)Param; 332 *pptl = gpsi->ptCursor; 333 } 334 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 335 { 336 Result = FALSE; 337 } 338 _SEH2_END; 339 break; 340 } 341 342 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT: 343 { 344 PPROCESSINFO ppi; 345 if (Param & LAYOUT_ORIENTATIONMASK || Param == LAYOUT_LTR) 346 { 347 ppi = PsGetCurrentProcessWin32Process(); 348 ppi->dwLayout = Param; 349 Result = TRUE; 350 break; 351 } 352 EngSetLastError(ERROR_INVALID_PARAMETER); 353 Result = FALSE; 354 break; 355 } 356 357 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT: 358 { 359 PPROCESSINFO ppi; 360 PDWORD pdwLayout; 361 Result = TRUE; 362 363 if (PsGetCurrentProcess() == gpepCSRSS) 364 { 365 EngSetLastError(ERROR_INVALID_ACCESS); 366 Result = FALSE; 367 break; 368 } 369 370 ppi = PsGetCurrentProcessWin32Process(); 371 _SEH2_TRY 372 { 373 pdwLayout = (PDWORD)Param; 374 *pdwLayout = ppi->dwLayout; 375 } 376 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 377 { 378 SetLastNtError(_SEH2_GetExceptionCode()); 379 Result = FALSE; 380 } 381 _SEH2_END; 382 break; 383 } 384 385 case ONEPARAM_ROUTINE_REPLYMESSAGE: 386 Result = co_MsqReplyMessage((LRESULT)Param); 387 break; 388 389 case ONEPARAM_ROUTINE_MESSAGEBEEP: 390 /* TODO: Implement sound sentry */ 391 Result = UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_MESSAGE_BEEP, Param); 392 break; 393 394 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS: 395 Result = UserSystemThreadProc(Param); 396 break; 397 398 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW: 399 Result = (DWORD_PTR)IntLockSetForegroundWindow(Param); 400 break; 401 402 case ONEPARAM_ROUTINE_ALLOWSETFOREGND: 403 Result = (DWORD_PTR)IntAllowSetForegroundWindow(Param); 404 break; 405 406 default: 407 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n", 408 Routine, Param); 409 EngSetLastError(ERROR_INVALID_PARAMETER); 410 Result = 0; 411 break; 412 } 413 414 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID)Result); 415 UserLeave(); 416 417 return Result; 418 } 419 420 421 /* 422 * @implemented 423 */ 424 DWORD_PTR 425 APIENTRY 426 NtUserCallTwoParam( 427 DWORD_PTR Param1, 428 DWORD_PTR Param2, 429 DWORD Routine) 430 { 431 PWND Window; 432 DWORD_PTR Ret; 433 TRACE("Enter NtUserCallTwoParam\n"); 434 UserEnterExclusive(); 435 436 switch (Routine) 437 { 438 case TWOPARAM_ROUTINE_REDRAWTITLE: 439 { 440 Window = UserGetWindowObject((HWND)Param1); 441 Ret = (DWORD_PTR)UserPaintCaption(Window, (INT)Param2); 442 break; 443 } 444 445 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT: 446 { 447 PMENU MenuObject = IntGetMenuObject((HMENU)Param1); 448 if (!MenuObject) 449 { 450 Ret = 0; 451 break; 452 } 453 454 if (Param2 > 0) 455 { 456 Ret = (MenuObject->cyMenu == (int)Param2); 457 MenuObject->cyMenu = (int)Param2; 458 } 459 else 460 Ret = (DWORD_PTR)MenuObject->cyMenu; 461 IntReleaseMenuObject(MenuObject); 462 break; 463 } 464 465 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE: 466 { 467 PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); 468 ASSERT(pti->MessageQueue); 469 Ret = (DWORD_PTR)MsqSetStateWindow(pti, (ULONG)Param1, (HWND)Param2); 470 break; 471 } 472 473 case TWOPARAM_ROUTINE_ENABLEWINDOW: 474 Ret = IntEnableWindow((HWND)Param1, (BOOL)Param2); 475 break; 476 477 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS: 478 { 479 Window = UserGetWindowObject((HWND)Param1); 480 if (!Window) 481 { 482 Ret = 0; 483 break; 484 } 485 486 Ret = (DWORD_PTR)IntShowOwnedPopups(Window, (BOOL)Param2); 487 break; 488 } 489 490 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE: 491 { 492 WPARAM wParam; 493 Window = UserGetWindowObject((HWND)Param1); 494 if (!Window) 495 { 496 Ret = 0; 497 break; 498 } 499 500 /* Unpack wParam */ 501 wParam = MAKEWPARAM((Param2 >> 3) & 0x3, 502 Param2 & (UISF_HIDEFOCUS | UISF_HIDEACCEL | UISF_ACTIVE)); 503 504 Ret = UserUpdateUiState(Window, wParam); 505 break; 506 } 507 508 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW: 509 { 510 HWND hwnd = (HWND)Param1; 511 BOOL fAltTab = (BOOL)Param2; 512 Ret = 0; 513 Window = UserGetWindowObject(hwnd); 514 if (!Window) 515 { 516 break; 517 } 518 if (MsqIsHung(Window->head.pti)) 519 { 520 // TODO: Make the window ghosted and activate. 521 break; 522 } 523 if (fAltTab) 524 { 525 if (Window->style & WS_MINIMIZE) 526 { 527 UserPostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); 528 } 529 /* bring window to top and activate */ 530 co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, 531 SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING | 532 SWP_NOOWNERZORDER | SWP_ASYNCWINDOWPOS); 533 } 534 else 535 { 536 UserSetActiveWindow(Window); 537 } 538 break; 539 } 540 541 case TWOPARAM_ROUTINE_SETCARETPOS: 542 Ret = (DWORD_PTR)co_IntSetCaretPos((int)Param1, (int)Param2); 543 break; 544 545 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS: 546 Ret = (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2); 547 break; 548 549 case TWOPARAM_ROUTINE_SETCURSORPOS: 550 Ret = (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, 0, 0, FALSE); 551 break; 552 553 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK: 554 Ret = IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2); 555 break; 556 557 default: 558 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n", 559 Routine, Param1, Param2); 560 EngSetLastError(ERROR_INVALID_PARAMETER); 561 Ret = 0; 562 } 563 564 565 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID)Ret); 566 UserLeave(); 567 568 return Ret; 569 } 570 571 572 /* 573 * @unimplemented 574 */ 575 BOOL 576 APIENTRY 577 NtUserCallHwndLock( 578 HWND hWnd, 579 DWORD Routine) 580 { 581 BOOL Ret = FALSE; 582 PWND Window; 583 USER_REFERENCE_ENTRY Ref; 584 585 TRACE("Enter NtUserCallHwndLock\n"); 586 UserEnterExclusive(); 587 588 if (!(Window = UserGetWindowObject(hWnd))) 589 { 590 Ret = FALSE; 591 goto Exit; 592 } 593 594 UserRefObjectCo(Window, &Ref); 595 596 /* FIXME: Routine can be 0x53 - 0x5E */ 597 switch (Routine) 598 { 599 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS: 600 co_WinPosArrangeIconicWindows(Window); 601 break; 602 603 case HWNDLOCK_ROUTINE_DRAWMENUBAR: 604 { 605 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n"); 606 Ret = TRUE; 607 if ((Window->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) 608 co_WinPosSetWindowPos(Window, 609 HWND_DESKTOP, 610 0, 0, 0, 0, 611 SWP_NOSIZE | 612 SWP_NOMOVE | 613 SWP_NOZORDER | 614 SWP_NOACTIVATE | 615 SWP_FRAMECHANGED); 616 break; 617 } 618 619 case HWNDLOCK_ROUTINE_REDRAWFRAME: 620 co_WinPosSetWindowPos(Window, 621 HWND_DESKTOP, 622 0, 0, 0, 0, 623 SWP_NOSIZE | 624 SWP_NOMOVE | 625 SWP_NOZORDER | 626 SWP_NOACTIVATE | 627 SWP_FRAMECHANGED); 628 Ret = TRUE; 629 break; 630 631 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK: 632 co_WinPosSetWindowPos(Window, 633 HWND_DESKTOP, 634 0, 0, 0, 0, 635 SWP_NOSIZE | 636 SWP_NOMOVE | 637 SWP_NOZORDER | 638 SWP_NOACTIVATE | 639 SWP_FRAMECHANGED); 640 if (!Window->spwndOwner && !IntGetParent(Window)) 641 { 642 co_IntShellHookNotify(HSHELL_REDRAW, (WPARAM)hWnd, FALSE); // FIXME Flashing? 643 } 644 Ret = TRUE; 645 break; 646 647 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW: 648 TRACE("co_IntSetForegroundWindow 1 0x%p\n", hWnd); 649 Ret = co_IntSetForegroundWindow(Window); 650 TRACE("co_IntSetForegroundWindow 2 0x%p\n", hWnd); 651 break; 652 653 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE: 654 TRACE("co_IntSetForegroundWindow M 1 0x%p\n", hWnd); 655 Ret = co_IntSetForegroundWindowMouse(Window); 656 TRACE("co_IntSetForegroundWindow M 2 0x%p\n", hWnd); 657 break; 658 659 case HWNDLOCK_ROUTINE_UPDATEWINDOW: 660 co_IntUpdateWindows(Window, RDW_ALLCHILDREN, FALSE); 661 Ret = TRUE; 662 break; 663 } 664 665 UserDerefObjectCo(Window); 666 667 Exit: 668 TRACE("Leave NtUserCallHwndLock, ret=%u\n", Ret); 669 UserLeave(); 670 671 return Ret; 672 } 673 674 /* 675 * @unimplemented 676 */ 677 HWND 678 APIENTRY 679 NtUserCallHwndOpt( 680 HWND hWnd, 681 DWORD Routine) 682 { 683 switch (Routine) 684 { 685 case HWNDOPT_ROUTINE_SETPROGMANWINDOW: 686 GetW32ThreadInfo()->pDeskInfo->hProgmanWindow = hWnd; 687 break; 688 689 case HWNDOPT_ROUTINE_SETTASKMANWINDOW: 690 GetW32ThreadInfo()->pDeskInfo->hTaskManWindow = hWnd; 691 break; 692 } 693 694 return hWnd; 695 } 696 697 DWORD 698 APIENTRY 699 NtUserCallHwnd( 700 HWND hWnd, 701 DWORD Routine) 702 { 703 switch (Routine) 704 { 705 case HWND_ROUTINE_GETWNDCONTEXTHLPID: 706 { 707 PWND Window; 708 DWORD HelpId; 709 710 UserEnterShared(); 711 712 if (!(Window = UserGetWindowObject(hWnd))) 713 { 714 UserLeave(); 715 return 0; 716 } 717 718 HelpId = (DWORD)(DWORD_PTR)UserGetProp(Window, gpsi->atomContextHelpIdProp, TRUE); 719 720 UserLeave(); 721 return HelpId; 722 } 723 724 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW: 725 if (IntIsWindow(hWnd)) 726 return IntRegisterShellHookWindow(hWnd); 727 return FALSE; 728 break; 729 730 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW: 731 if (IntIsWindow(hWnd)) 732 return IntDeRegisterShellHookWindow(hWnd); 733 return FALSE; 734 735 case HWND_ROUTINE_SETMSGBOX: 736 { 737 PWND Window; 738 UserEnterExclusive(); 739 if ((Window = UserGetWindowObject(hWnd))) 740 { 741 Window->state |= WNDS_MSGBOX; 742 } 743 UserLeave(); 744 return FALSE; 745 } 746 } 747 748 STUB; 749 750 return 0; 751 } 752 753 DWORD 754 APIENTRY 755 NtUserCallHwndParam( 756 HWND hWnd, 757 DWORD_PTR Param, 758 DWORD Routine) 759 { 760 761 switch (Routine) 762 { 763 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER: 764 return IntKillTimer(UserGetWindowObject(hWnd), (UINT_PTR)Param, TRUE); 765 766 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID: 767 { 768 PWND Window; 769 770 UserEnterExclusive(); 771 if (!(Window = UserGetWindowObject(hWnd))) 772 { 773 UserLeave(); 774 return FALSE; 775 } 776 777 if (Param) 778 UserSetProp(Window, gpsi->atomContextHelpIdProp, (HANDLE)Param, TRUE); 779 else 780 UserRemoveProp(Window, gpsi->atomContextHelpIdProp, TRUE); 781 782 UserLeave(); 783 return TRUE; 784 } 785 786 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER: 787 { 788 PWND pWnd; 789 USER_REFERENCE_ENTRY Ref; 790 791 UserEnterExclusive(); 792 793 if (!(pWnd = UserGetWindowObject(hWnd))) 794 { 795 UserLeave(); 796 return 0; 797 } 798 UserRefObjectCo(pWnd, &Ref); 799 800 if (pWnd->head.pti->ppi == PsGetCurrentProcessWin32Process() && 801 pWnd->cbwndExtra == DLGWINDOWEXTRA && 802 !(pWnd->state & WNDS_SERVERSIDEWINDOWPROC)) 803 { 804 if (Param) 805 { 806 if (!pWnd->fnid) pWnd->fnid = FNID_DIALOG; 807 pWnd->state |= WNDS_DIALOGWINDOW; 808 } 809 else 810 { 811 pWnd->fnid |= FNID_DESTROY; 812 pWnd->state &= ~WNDS_DIALOGWINDOW; 813 } 814 } 815 816 UserDerefObjectCo(pWnd); 817 UserLeave(); 818 return 0; 819 } 820 821 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT: 822 { 823 PWND pWnd; 824 PNOTIFYEVENT pne; 825 UserEnterExclusive(); 826 pne = (PNOTIFYEVENT)Param; 827 if (hWnd) 828 pWnd = UserGetWindowObject(hWnd); 829 else 830 pWnd = NULL; 831 IntNotifyWinEvent(pne->event, pWnd, pne->idObject, pne->idChild, pne->flags); 832 UserLeave(); 833 return 0; 834 } 835 836 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE: 837 { 838 PWND pWnd; 839 UserEnterExclusive(); 840 pWnd = UserGetWindowObject(hWnd); 841 if (pWnd) IntClearWindowState(pWnd, (UINT)Param); 842 UserLeave(); 843 return 0; 844 } 845 846 case HWNDPARAM_ROUTINE_SETWINDOWSTATE: 847 { 848 PWND pWnd; 849 UserEnterExclusive(); 850 pWnd = UserGetWindowObject(hWnd); 851 if (pWnd) IntSetWindowState(pWnd, (UINT)Param); 852 UserLeave(); 853 return 0; 854 } 855 } 856 857 STUB; 858 859 return 0; 860 } 861 862 DWORD 863 APIENTRY 864 NtUserCallHwndParamLock( 865 HWND hWnd, 866 DWORD_PTR Param, 867 DWORD Routine) 868 { 869 DWORD Ret = FALSE; 870 PWND Window; 871 USER_REFERENCE_ENTRY Ref; 872 873 TRACE("Enter NtUserCallHwndParamLock\n"); 874 UserEnterExclusive(); 875 876 if (!(Window = UserGetWindowObject(hWnd))) 877 { 878 Ret = FALSE; 879 goto Exit; 880 } 881 882 UserRefObjectCo(Window, &Ref); 883 884 switch (Routine) 885 { 886 case TWOPARAM_ROUTINE_VALIDATERGN: 887 { 888 PREGION Rgn = REGION_LockRgn((HRGN)Param); 889 Ret = (DWORD)co_UserRedrawWindow(Window, NULL, Rgn, RDW_VALIDATE); 890 if (Rgn) REGION_UnlockRgn(Rgn); 891 break; 892 } 893 } 894 895 UserDerefObjectCo(Window); 896 897 Exit: 898 899 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n", Ret); 900 UserLeave(); 901 902 return Ret; 903 } 904 905 /* EOF */ 906