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 break; 516 517 if (gpqForeground && !fAltTab) 518 { 519 PWND pwndActive = gpqForeground->spwndActive; 520 if (pwndActive && !(pwndActive->ExStyle & WS_EX_TOPMOST)) 521 { 522 co_WinPosSetWindowPos(pwndActive, HWND_BOTTOM, 0, 0, 0, 0, 523 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | 524 SWP_NOSENDCHANGING | SWP_ASYNCWINDOWPOS); 525 } 526 } 527 528 UserSetActiveWindow(Window); 529 530 if (fAltTab && (Window->style & WS_MINIMIZE)) 531 { 532 MSG msg = { Window->head.h, WM_SYSCOMMAND, SC_RESTORE, 0 }; 533 MsqPostMessage(Window->head.pti, &msg, FALSE, QS_POSTMESSAGE, 0, 0); 534 } 535 break; 536 } 537 538 case TWOPARAM_ROUTINE_SETCARETPOS: 539 Ret = (DWORD_PTR)co_IntSetCaretPos((int)Param1, (int)Param2); 540 break; 541 542 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS: 543 Ret = (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2); 544 break; 545 546 case TWOPARAM_ROUTINE_SETCURSORPOS: 547 Ret = (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, 0, 0, FALSE); 548 break; 549 550 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK: 551 Ret = IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2); 552 break; 553 554 default: 555 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n", 556 Routine, Param1, Param2); 557 EngSetLastError(ERROR_INVALID_PARAMETER); 558 Ret = 0; 559 } 560 561 562 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID)Ret); 563 UserLeave(); 564 565 return Ret; 566 } 567 568 569 /* 570 * @unimplemented 571 */ 572 BOOL 573 APIENTRY 574 NtUserCallHwndLock( 575 HWND hWnd, 576 DWORD Routine) 577 { 578 BOOL Ret = FALSE; 579 PWND Window; 580 USER_REFERENCE_ENTRY Ref; 581 582 TRACE("Enter NtUserCallHwndLock\n"); 583 UserEnterExclusive(); 584 585 if (!(Window = UserGetWindowObject(hWnd))) 586 { 587 Ret = FALSE; 588 goto Exit; 589 } 590 591 UserRefObjectCo(Window, &Ref); 592 593 /* FIXME: Routine can be 0x53 - 0x5E */ 594 switch (Routine) 595 { 596 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS: 597 co_WinPosArrangeIconicWindows(Window); 598 break; 599 600 case HWNDLOCK_ROUTINE_DRAWMENUBAR: 601 { 602 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n"); 603 Ret = TRUE; 604 if ((Window->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) 605 co_WinPosSetWindowPos(Window, 606 HWND_DESKTOP, 607 0, 0, 0, 0, 608 SWP_NOSIZE | 609 SWP_NOMOVE | 610 SWP_NOZORDER | 611 SWP_NOACTIVATE | 612 SWP_FRAMECHANGED); 613 break; 614 } 615 616 case HWNDLOCK_ROUTINE_REDRAWFRAME: 617 co_WinPosSetWindowPos(Window, 618 HWND_DESKTOP, 619 0, 0, 0, 0, 620 SWP_NOSIZE | 621 SWP_NOMOVE | 622 SWP_NOZORDER | 623 SWP_NOACTIVATE | 624 SWP_FRAMECHANGED); 625 Ret = TRUE; 626 break; 627 628 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK: 629 co_WinPosSetWindowPos(Window, 630 HWND_DESKTOP, 631 0, 0, 0, 0, 632 SWP_NOSIZE | 633 SWP_NOMOVE | 634 SWP_NOZORDER | 635 SWP_NOACTIVATE | 636 SWP_FRAMECHANGED); 637 if (!Window->spwndOwner && !IntGetParent(Window)) 638 { 639 co_IntShellHookNotify(HSHELL_REDRAW, (WPARAM)hWnd, FALSE); // FIXME Flashing? 640 } 641 Ret = TRUE; 642 break; 643 644 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW: 645 TRACE("co_IntSetForegroundWindow 1 0x%p\n", hWnd); 646 Ret = co_IntSetForegroundWindow(Window); 647 TRACE("co_IntSetForegroundWindow 2 0x%p\n", hWnd); 648 break; 649 650 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE: 651 TRACE("co_IntSetForegroundWindow M 1 0x%p\n", hWnd); 652 Ret = co_IntSetForegroundWindowMouse(Window); 653 TRACE("co_IntSetForegroundWindow M 2 0x%p\n", hWnd); 654 break; 655 656 case HWNDLOCK_ROUTINE_UPDATEWINDOW: 657 co_IntUpdateWindows(Window, RDW_ALLCHILDREN, FALSE); 658 Ret = TRUE; 659 break; 660 } 661 662 UserDerefObjectCo(Window); 663 664 Exit: 665 TRACE("Leave NtUserCallHwndLock, ret=%u\n", Ret); 666 UserLeave(); 667 668 return Ret; 669 } 670 671 /* 672 * @unimplemented 673 */ 674 HWND 675 APIENTRY 676 NtUserCallHwndOpt( 677 HWND hWnd, 678 DWORD Routine) 679 { 680 switch (Routine) 681 { 682 case HWNDOPT_ROUTINE_SETPROGMANWINDOW: 683 GetW32ThreadInfo()->pDeskInfo->hProgmanWindow = hWnd; 684 break; 685 686 case HWNDOPT_ROUTINE_SETTASKMANWINDOW: 687 GetW32ThreadInfo()->pDeskInfo->hTaskManWindow = hWnd; 688 break; 689 } 690 691 return hWnd; 692 } 693 694 DWORD 695 APIENTRY 696 NtUserCallHwnd( 697 HWND hWnd, 698 DWORD Routine) 699 { 700 switch (Routine) 701 { 702 case HWND_ROUTINE_GETWNDCONTEXTHLPID: 703 { 704 PWND Window; 705 DWORD HelpId; 706 707 UserEnterShared(); 708 709 if (!(Window = UserGetWindowObject(hWnd))) 710 { 711 UserLeave(); 712 return 0; 713 } 714 715 HelpId = (DWORD)(DWORD_PTR)UserGetProp(Window, gpsi->atomContextHelpIdProp, TRUE); 716 717 UserLeave(); 718 return HelpId; 719 } 720 721 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW: 722 if (IntIsWindow(hWnd)) 723 return IntRegisterShellHookWindow(hWnd); 724 return FALSE; 725 break; 726 727 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW: 728 if (IntIsWindow(hWnd)) 729 return IntDeRegisterShellHookWindow(hWnd); 730 return FALSE; 731 732 case HWND_ROUTINE_SETMSGBOX: 733 { 734 PWND Window; 735 UserEnterExclusive(); 736 if ((Window = UserGetWindowObject(hWnd))) 737 { 738 Window->state |= WNDS_MSGBOX; 739 } 740 UserLeave(); 741 return FALSE; 742 } 743 } 744 745 STUB; 746 747 return 0; 748 } 749 750 DWORD 751 APIENTRY 752 NtUserCallHwndParam( 753 HWND hWnd, 754 DWORD_PTR Param, 755 DWORD Routine) 756 { 757 758 switch (Routine) 759 { 760 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER: 761 { 762 DWORD ret; 763 764 UserEnterExclusive(); 765 ret = IntKillTimer(UserGetWindowObject(hWnd), (UINT_PTR)Param, TRUE); 766 UserLeave(); 767 return ret; 768 } 769 770 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID: 771 { 772 PWND Window; 773 774 UserEnterExclusive(); 775 if (!(Window = UserGetWindowObject(hWnd))) 776 { 777 UserLeave(); 778 return FALSE; 779 } 780 781 if (Param) 782 UserSetProp(Window, gpsi->atomContextHelpIdProp, (HANDLE)Param, TRUE); 783 else 784 UserRemoveProp(Window, gpsi->atomContextHelpIdProp, TRUE); 785 786 UserLeave(); 787 return TRUE; 788 } 789 790 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER: 791 { 792 PWND pWnd; 793 USER_REFERENCE_ENTRY Ref; 794 795 UserEnterExclusive(); 796 797 if (!(pWnd = UserGetWindowObject(hWnd))) 798 { 799 UserLeave(); 800 return 0; 801 } 802 UserRefObjectCo(pWnd, &Ref); 803 804 if (pWnd->head.pti->ppi == PsGetCurrentProcessWin32Process() && 805 pWnd->cbwndExtra >= DLGWINDOWEXTRA && 806 !(pWnd->state & WNDS_SERVERSIDEWINDOWPROC)) 807 { 808 pWnd->DialogPointer = (PVOID)Param; 809 if (Param) 810 { 811 if (!pWnd->fnid) pWnd->fnid = FNID_DIALOG; 812 pWnd->state |= WNDS_DIALOGWINDOW; 813 } 814 else 815 { 816 pWnd->fnid |= FNID_DESTROY; 817 pWnd->state &= ~WNDS_DIALOGWINDOW; 818 } 819 } 820 821 UserDerefObjectCo(pWnd); 822 UserLeave(); 823 return 0; 824 } 825 826 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT: 827 { 828 PWND pWnd; 829 PNOTIFYEVENT pne; 830 UserEnterExclusive(); 831 pne = (PNOTIFYEVENT)Param; 832 if (hWnd) 833 pWnd = UserGetWindowObject(hWnd); 834 else 835 pWnd = NULL; 836 IntNotifyWinEvent(pne->event, pWnd, pne->idObject, pne->idChild, pne->flags); 837 UserLeave(); 838 return 0; 839 } 840 841 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE: 842 { 843 PWND pWnd; 844 UserEnterExclusive(); 845 pWnd = UserGetWindowObject(hWnd); 846 if (pWnd) IntClearWindowState(pWnd, (UINT)Param); 847 UserLeave(); 848 return 0; 849 } 850 851 case HWNDPARAM_ROUTINE_SETWINDOWSTATE: 852 { 853 PWND pWnd; 854 UserEnterExclusive(); 855 pWnd = UserGetWindowObject(hWnd); 856 if (pWnd) IntSetWindowState(pWnd, (UINT)Param); 857 UserLeave(); 858 return 0; 859 } 860 } 861 862 STUB; 863 864 return 0; 865 } 866 867 DWORD 868 APIENTRY 869 NtUserCallHwndParamLock( 870 HWND hWnd, 871 DWORD_PTR Param, 872 DWORD Routine) 873 { 874 DWORD Ret = FALSE; 875 PWND Window; 876 USER_REFERENCE_ENTRY Ref; 877 878 TRACE("Enter NtUserCallHwndParamLock\n"); 879 UserEnterExclusive(); 880 881 if (!(Window = UserGetWindowObject(hWnd))) 882 { 883 Ret = FALSE; 884 goto Exit; 885 } 886 887 UserRefObjectCo(Window, &Ref); 888 889 switch (Routine) 890 { 891 case TWOPARAM_ROUTINE_VALIDATERGN: 892 { 893 PREGION Rgn = REGION_LockRgn((HRGN)Param); 894 Ret = (DWORD)co_UserRedrawWindow(Window, NULL, Rgn, RDW_VALIDATE); 895 if (Rgn) REGION_UnlockRgn(Rgn); 896 break; 897 } 898 } 899 900 UserDerefObjectCo(Window); 901 902 Exit: 903 904 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n", Ret); 905 UserLeave(); 906 907 return Ret; 908 } 909 910 /* EOF */ 911