diff --git a/reactos/include/defines.h b/reactos/include/defines.h index d768b220f26..29ab9868534 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -49,7 +49,9 @@ //#define STATUS_PENDING (0x00000103L) #endif /* WIN32_NO_STATUS */ - +#define GA_PARENT (1) +#define GA_ROOT (2) +#define GA_ROOTOWNER (3) /* CreateFile, GetFileAttributes, SetFileAttributes */ diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 11ec1697a67..34376fa6096 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -509,11 +509,9 @@ NtUserGetAltTabInfo( DWORD Unknown4, DWORD Unknown5); -DWORD -STDCALL -NtUserGetAncestor( - DWORD Unknown0, - DWORD Unknown1); +HWND STDCALL +NtUserGetAncestor(HWND hWnd, UINT Flags); + DWORD STDCALL diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 49629f7f8fb..b9877fe9bc1 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.8 2002/07/17 21:04:54 dwelch Exp $ +/* $Id: window.c,v 1.9 2002/08/30 02:47:36 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -541,10 +541,9 @@ GetAltTabInfoW(HWND hwnd, } HWND STDCALL -GetAncestor(HWND hwnd, - UINT gaFlags) +GetAncestor(HWND hwnd, UINT gaFlags) { - return (HWND)0; + return(NtUserGetAncestor(hwnd, gaFlags)); } WINBOOL STDCALL @@ -719,7 +718,15 @@ IsWindowUnicode(HWND hWnd) WINBOOL STDCALL IsWindowVisible(HWND hWnd) { - return FALSE; + while (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) + { + if (!(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE)) + { + return(FALSE); + } + hWnd = GetAncestor(hWnd, GA_PARENT); + } + return(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE); } WINBOOL STDCALL diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 27343e78cd0..8d22ccde895 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: trap.s,v 1.13 2002/07/17 21:04:55 dwelch Exp $ +/* $Id: trap.s,v 1.14 2002/08/30 02:47:36 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/trap.s @@ -40,14 +40,7 @@ _KiTrapEpilog: cmpl $1, %eax /* Check for v86 recovery */ jne _KiTrapRet jmp _KiV86Complete -_KiTrapRet: - /* Get a pointer to the current thread */ - movl %fs:0x124, %esi - - /* Restore the old trap frame pointer */ - movl 0x3c(%esp), %ebx - movl %ebx, KTHREAD_TRAP_FRAME(%esi) - +_KiTrapRet: /* Skip debug information and unsaved registers */ addl $0x30, %esp popl %gs @@ -138,21 +131,31 @@ _KiTrapProlog: pushl $0 /* XXX: DebugArgMark */ movl 0x60(%esp), %ebx pushl %ebx /* XXX: DebugEIP */ - pushl %ebp /* XXX: DebugEBP */ - + pushl %ebp /* XXX: DebugEBP */ + /* Load the segment registers */ movl $KERNEL_DS, %ebx movl %ebx, %ds movl %ebx, %es movl %ebx, %gs - + /* Set ES to kernel segment */ movw $KERNEL_DS,%bx movw %bx,%es movl %esp, %ebx - movl %esp, %ebp - + movl %esp, %ebp + + /* Save the old trap frame. */ + cmpl $0, %edi + je .L7 + movl %ss:KTHREAD_TRAP_FRAME(%edi), %edx + pushl %edx + jmp .L8 +.L7: + pushl $0 +.L8: + /* Save a pointer to the trap frame in the current KTHREAD */ cmpl $0, %edi je .L6 @@ -166,6 +169,13 @@ _KiTrapProlog: addl $4, %esp addl $4, %esp + /* Get a pointer to the current thread */ + movl %fs:0x124, %esi + + /* Restore the old trap frame pointer */ + popl %ebx + movl %ebx, KTHREAD_TRAP_FRAME(%esi) + /* Return to the caller */ jmp _KiTrapEpilog diff --git a/reactos/ntoskrnl/ps/w32call.c b/reactos/ntoskrnl/ps/w32call.c index 6308fcd41be..652f0bf470a 100644 --- a/reactos/ntoskrnl/ps/w32call.c +++ b/reactos/ntoskrnl/ps/w32call.c @@ -1,4 +1,4 @@ -/* $Id: w32call.c,v 1.1 2002/06/18 22:03:48 dwelch Exp $ +/* $Id: w32call.c,v 1.2 2002/08/30 02:47:37 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,6 +43,7 @@ typedef struct _NTW32CALL_SAVED_STATE PULONG CallerResultLength; PNTSTATUS CallbackStatus; PKTRAP_FRAME SavedTrapFrame; + PVOID SavedCallbackStack; } NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE; /* FUNCTIONS ***************************************************************/ @@ -63,6 +64,7 @@ NtCallbackReturn (PVOID Result, KIRQL oldIrql; PNTW32CALL_SAVED_STATE State; PKTRAP_FRAME SavedTrapFrame; + PVOID SavedCallbackStack; Thread = PsGetCurrentThread(); if (Thread->Tcb.CallbackStack == NULL) @@ -71,12 +73,11 @@ NtCallbackReturn (PVOID Result, } OldStack = (PULONG)Thread->Tcb.CallbackStack; - Thread->Tcb.CallbackStack = NULL; /* * Get the values that NtW32Call left on the inactive stack for us. */ - State = (PNTW32CALL_SAVED_STATE)OldStack[0]; + State = (PNTW32CALL_SAVED_STATE)OldStack[0]; CallbackStatus = State->CallbackStatus; CallerResultLength = State->CallerResultLength; CallerResult = State->CallerResult; @@ -84,6 +85,7 @@ NtCallbackReturn (PVOID Result, StackBase = State->SavedStackBase; StackLimit = State->SavedStackLimit; SavedTrapFrame = State->SavedTrapFrame; + SavedCallbackStack = State->SavedCallbackStack; /* * Copy the callback status and the callback result to NtW32Call @@ -110,6 +112,7 @@ NtCallbackReturn (PVOID Result, Thread->Tcb.StackBase = StackBase; Thread->Tcb.StackLimit = StackLimit; Thread->Tcb.TrapFrame = SavedTrapFrame; + Thread->Tcb.CallbackStack = SavedCallbackStack; KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack; KeStackSwitchAndRet((PVOID)(OldStack + 1)); @@ -199,14 +202,10 @@ NtW32Call (IN ULONG RoutineIndex, NTSTATUS CallbackStatus; NTW32CALL_SAVED_STATE SavedState; - DPRINT1("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n", + DPRINT("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n", RoutineIndex, Argument, ArgumentLength); Thread = PsGetCurrentThread(); - if (Thread->Tcb.CallbackStack != NULL) - { - return(STATUS_UNSUCCESSFUL); - } /* Set up the new kernel and user environment. */ StackSize = (ULONG)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit); @@ -233,6 +232,7 @@ NtW32Call (IN ULONG RoutineIndex, SavedState.CallerResultLength = ResultLength; SavedState.CallbackStatus = &CallbackStatus; SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame; + SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack; Thread->Tcb.InitialStack = Thread->Tcb.StackBase = NewStack + StackSize; Thread->Tcb.StackLimit = (ULONG)NewStack; Thread->Tcb.KernelStack = NewStack + StackSize - sizeof(KTRAP_FRAME); diff --git a/reactos/subsys/win32k/ntuser/stubs.c b/reactos/subsys/win32k/ntuser/stubs.c index 70b89301a18..433269366f1 100644 --- a/reactos/subsys/win32k/ntuser/stubs.c +++ b/reactos/subsys/win32k/ntuser/stubs.c @@ -654,17 +654,6 @@ NtUserGetAltTabInfo( return 0; } -DWORD -STDCALL -NtUserGetAncestor( - DWORD Unknown0, - DWORD Unknown1) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserGetAsyncKeyState( diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 3ded8329095..f8efd30ac8b 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.11 2002/08/26 23:20:54 dwelch Exp $ +/* $Id: window.c,v 1.12 2002/08/30 02:47:37 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,6 +28,42 @@ /* FUNCTIONS *****************************************************************/ +HWND STDCALL +NtUserGetAncestor(HWND hWnd, UINT Flags) +{ + if (W32kIsDesktopWindow(hWnd)) + { + return(NULL); + } + if (Flags & GA_PARENT) + { + PWINDOW_OBJECT Window; + HWND hParent; + + Window = W32kGetWindowObject(hWnd); + if (Window == NULL) + { + return(NULL); + } + + if (Window->Parent == NULL) + { + W32kReleaseWindowObject(Window); + } + + hParent = Window->Parent->Self; + + W32kReleaseWindowObject(Window); + + return(hParent); + } + else + { + UNIMPLEMENTED; + return(NULL); + } +} + VOID W32kSetFocusWindow(HWND hWnd) {